【发布时间】:2021-02-20 08:33:26
【问题描述】:
下面的代码对数字 0.01、0.02、0.03、...、0.99 运行模数 0.01
var testVals = Enumerable.Range(1, 99).Select(n => double.Parse("0." + n.ToString("D2")));
var moduloTest = testVals.Select(v => v % 0.01).ToList();
(注意:从字符串中解析双精度数是有意的,这样对浮点数进行的唯一数学运算就是模数)
我希望这里的 moduleTest 列表包含几个非常接近 0 的浮点值。但是列表中的许多值反而非常接近 0.1。
我知道浮点数学并不精确,并且会引入舍入误差,但这里的 0.1 甚至不接近 0。
【问题讨论】:
-
这能回答你的问题吗? Is floating point math broken?
-
@phuclv 我认为该页面上根本没有提到模数,所以我不认为它是重复的。我自己想出了一个答案,我在下面添加了它。
-
模运算符在这里完全不相关。问题是二进制浮点类型不能正确表示所有十进制值,因此无论您使用什么运算符,无论是 +、-、* 还是 /,结果都会“不正确”
-
我认为模数是相关的。大多数内置数学运算符都有平滑的曲线,这意味着您的结果至少会四舍五入到预期值。模数是一个例外,它具有锯齿曲线(请参阅 chux 答案),因此您可以得到一个不符合您期望的答案。
标签: c# floating-point modulo modulus