c# float 取模运算符

标签 c# floating-point modulo modulus

下面的代码对数字 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();
(注意:从字符串中解析 double 是有意的,这样对浮点数进行的唯一数学运算就是模数)
我希望这里的 moduleTest 列表包含几个非常接近 0 的浮点值。然而,列表中的许多值都非常接近 0.1。
我知道浮点数学并不精确,并引入了舍入误差,但这里的 0.1 甚至不接近于 0。

最佳答案

I understand that floating point math is not exact, but in many cases here it seems to be not even close.


这里的模数没有增加错误/不精确,只是使先验不精确的影响非常明显。

随着模数的质量实现,没有不精确。见 Is fmod() exact when y is an integer? .
问题在于假设数学与十进制值(如 0.01)的行为总是接近转换为最接近的可表示浮点数的那些值。有限浮点值都是精确的。形成它们的值的操作是“错误”出现的地方——有一些异常(exception),比如模数。
以十六进制或足够的十进制精度(如 17 个有效小数位)打印值通常足以显示预期的 0.01 未编码为浮点数 0.01,而是接近该值的值。对计算结果也执行此操作以获得更深入的了解。
模运算的本质是 sawtooth曲线如绿线here .
鉴于在 0.01 转换中产生的错误和 / ,(不是模数),OP 值的模数的结果预期正好在不连续性的两侧:大约 0.0 或接近 0.01。

关于c# float 取模运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64734431/

相关文章:

c# - 窗体 : datagridview: height (autosize) depending on number of rows

c - linux内核中的 float 比较给出链接错误

binary - 是否可以将最高有效的十进制数字精度转换为二进制并返回十进制而又不丢失有效值6或7.225?

c++ - 你为什么要将 10^9+7 加到一个数字上,然后用 10^9+7 求模

c# - 查找 CultureInfo 的资源

c# - SQLite 标量函数返回类型始终为字符串?

c# - IdentityServer4 和 Code with PKCE testing with Postman

algorithm - 通过下溢收敛到零

algorithm - 使用模的 while 循环的时间复杂度

java - Java中的模运算,Android问题