excel - 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))
解决方案
使用cLng 函数代替Int函数。While将截断小数,将四舍五入为.Int
cLng
Long
示例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.99999999999998
会Int
截断2
但cLng
会四舍五入的数字3
。
请注意,Excel 是一个数值计算程序,类型Double
的值不是精确值。小数(与任何标准计算器一样)仅计算到定义的精度。所以Double
类型3
不是 a3
而是非常接近3
like的东西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ᵗʰ 数字是不同的。
关于此的更多信息:
- Microsoft_Excel(维基百科)中的数值精度
- 浮点运算可能会在 Excel 中给出不准确的结果(Microsoft 文档)
- 比较 VBA 精度问题中的双精度问题(堆栈溢出)
推荐阅读
- spring-boot - 我想使用@Scheduler 注释在rabbitMQ 中以5 秒的延迟发送消息
- javascript - 在节点 js 应用程序中使用 jquery 或 javascript 在表格的单元格内创建 Svg 行
- javascript - 无法用玩笑和酶模拟点击菜单 Antd
- javascript - 在 VueJS 中定义一个引用变量
- python - 在 Scapy 数据包中包含命令的输出
- powerbi - 我在 Power Bi Report Builder 中找不到登录选项
- excel - 关于使用 VBA 在 Excel 上禁用按钮
- python - Python yield 语句每次都返回相同的值
- node.js - 尝试异步调用 AWS lambda。什么都没发生
- node.js - 通过 dropbox-v2-api nodejs 将大文件上传到 Dropbox