首页 > 解决方案 > excel(vba)中的日志功能 - 没有给我正确的答案

问题描述

在下面的代码片段中, temp_int2 的值为 1,对我来说毫无意义。--> log(1000) = 3,即以10为底的对数,对数函数以'e'为底。

我不确定它的“INT”功能是否有问题,但有人可以帮忙。

在此处输入图像描述

temp_int2 = Int(Log(1000) / Log(10)) - 1
    'temp_int2 = Int(Log(cap_dec) / Log(10)) - 1

    MsgBox ("Value of log functuon -->" & CStr(Log(cap_dec) / Log(10)) & "    value after log function " & CStr(temp_int2))

标签: excelvba

解决方案


使用cLng 函数代替Int函数。While将截断小数,将四舍五入为.IntcLngLong

示例Int将被切断

Int(99.2) '= 99
Int(99.5) '= 99
Int(99.8) '= 99

cLng会圆

cLng(99.2) '= 99
cLng(99.5) '= 100
cLng(99.8) '= 100

由于计算机和计算器计算的是数字而不是代数,因此计算中可能存在精度问题,并且Log(1000) / Log(10)完全是代数3,而是一个3类似于2.99999999999998Int截断2cLng会四舍五入的数字3

请注意,Excel 是一个数值计算程序,类型Double的值不是精确值。小数(与任何标准计算器一样)仅计算到定义的精度。所以Double类型3不是 a3而是非常接近3like的东西2.99999999999998。所以Log 函数返回 aDouble并且 devisionLog(1000) / Log(10)返回 a Double,这并不完全 3但非常接近3

请注意,这不是错误,而是数值计算的本质,它从不精确,而只是精确,而代数计算可以是精确的。


比较 type 的值时会出现同样的问题Double

If DoubleA = DoubleB Then 'might not work

在这里你需要使用类似的东西

If (DoubleA - DoubleB) ^ 2 < (10^ - Digits)^2

其中Digits是需要相同的位数。例子

DoubleA = 0.9999999999
DoubleB = 1.0000000001

然后Digits需要将<= 9它们视为平等。

如果您需要经常这样做,那么使用一个函数会很方便:

Option Explicit

Public Function IsDoubleValueTheSame(DoubleA As Double, DoubleB As Double, Optional Digits As Long = 12) As Boolean
    IsDoubleValueTheSame = (DoubleA - DoubleB) ^ 2 < (10 ^ -Digits) ^ 2
End Function

并称它为

Debug.Print IsDoubleValueTheSame(0.9999999999, 1.0000000001, 9)  'true
Debug.Print IsDoubleValueTheSame(0.9999999999, 1.0000000001, 10) 'false

所以回到你最初的例子:

Debug.Print Log(1000) / Log(10) = 3 'false
Debug.Print IsDoubleValueTheSame(Log(1000) / Log(10), 3, 15) 'true
Debug.Print IsDoubleValueTheSame(Log(1000) / Log(10), 3, 16) 'false

这意味着Log(1000) / Log(10)实际上3精确到15数字,而 16ᵗʰ 数字是不同的。

关于此的更多信息:


推荐阅读