MOD
Excel 中的函数应返回 Excel 中的模余数
我相信该函数=MOD(0.9, 0.3)
应该给出 0,因为基本上 0.3*3 是 0.9
但它给出的是 5.55112E-17
有什么提示表明哪里出了问题吗?
答案1
Excel 用途IEEE-754 双精度和其他任何二进制浮点类型,不可能准确表示 0.9 或 0.3 这样的小数值。实际值只是很接近对他们来说,0.90000000000000002220446049250313080847263336181640625
确切地说0.299999999999999988897769753748434595763683319091796875
。
模运算的结果是5.5511151231257827021181583404541015625 × 10 -17这是一个非常非常小的值,几乎为零,Excel 将其显示为四舍五入 5.55112E-17
为这里没有什么问题!要修复此问题,您可以:
- 将结果手动四舍五入为小数点后 1 位(与输入的小数位数相同),Excel 将正确显示 0,或者
- 使用虚拟专用网络它有自己的十进制类型(并且具有更高精度的整数类型)可以直接在 VBA 中执行操作,也可以编写用户定义函数用于 Excel
重复二进制数和结果接近于零的计算
影响二进制浮点数存储的另一个令人困惑的问题是,一些十进制数中有限、不循环的数字,在二进制中却是无限、重复的数字。最常见的例子是值 0.1 及其变体。虽然这些数字可以完美地以十进制表示,但当以尾数存储时,二进制格式的相同数字将变成以下循环二进制数:
000110011001100110011(依此类推)
IEEE 754 规范不对任何数字做出特殊处理。它存储尾数中可以存储的部分,并截断其余部分。这会导致大约 -2.8E-17 的误差,或者存储时为 0.0000000000000000028。
即使是常见的十进制小数,例如十进制的 0.0001,也无法用二进制精确表示。(0.0001 是一个循环的二进制小数,周期为 104 位)。这类似于为什么小数 1/3 无法用十进制精确表示(循环的 0.33333333333333333333)。
进一步阅读
- Excel 中的浮点运算可能会产生不准确的结果关于 Excel 的详细实现以及修复/解决该问题的方法
- 浮点数学有问题吗?由于技术原因全部使用二进制浮点的应用程序
- Microsoft Excel 中的数字精度
- 每个程序员都应该了解的浮点运算
- 每位计算机科学家都应该了解的浮点运算
答案2
在我的例子中,它应该为零,但MOD(0.15,0.05)
返回了(正好输入了三次)。这看起来像是一个错误。0.05
0.05
0.15
因此我避免使用该MOD()
功能并改用:
num1/num2 - trunc(num1/num2))*num2
四舍五入到小数点后10位。
答案3
ExcelVisual Basic
在其编程中使用。因此,微软提及 mod 操作作为
浮点不精确
使用浮点数时,请记住它们在内存中并不总是具有精确的表示。这可能会导致某些运算(例如值比较和 Mod 运算符)产生意外结果。