Excel 模数函数 MOD(0.9, 0.3) 返回意外结果

Excel 模数函数 MOD(0.9, 0.3) 返回意外结果

MODExcel 中的函数应返回 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这里没有什么问题!要修复此问题,您可以:

重复二进制数和结果接近于零的计算

影响二进制浮点数存储的另一个令人困惑的问题是,一些十进制数中有限、不循环的数字,在二进制中却是无限、重复的数字。最常见的例子是值 0.1 及其变体。虽然这些数字可以完美地以十进制表示,但当以尾数存储时,二进制格式的相同数字将变成以下循环二进制数:

000110011001100110011(依此类推)

IEEE 754 规范不对任何数字做出特殊处理。它存储尾数中可以存储的部分,并截断其余部分。这会导致大约 -2.8E-17 的误差,或者存储时为 0.0000000000000000028。

即使是常见的十进制小数,例如十进制的 0.0001,也无法用二进制精确表示。(0.0001 是一个循环的二进制小数,周期为 104 位)。这类似于为什么小数 1/3 无法用十进制精确表示(循环的 0.33333333333333333333)。

进一步阅读

答案2

在我的例子中,它应该为零,但MOD(0.15,0.05)返回了(正好输入了三次)。这看起来像是一个错误。0.050.050.15

因此我避免使用该MOD()功能并改用:

num1/num2 - trunc(num1/num2))*num2

四舍五入到小数点后10位。

答案3

ExcelVisual Basic在其编程中使用。因此,微软提及 mod 操作作为

浮点不精确
使用浮点数时,请记住它们在内存中并不总是具有精确的表示。这可能会导致某些运算(例如值比较和 Mod 运算符)产生意外结果。

答案4

相关内容