为什么0.1*10.0 == 1

Ric*_*h C 0 floating-point matlab

在MATLAB中,以下是正确的

0.1 * 10.0 == 1
Run Code Online (Sandbox Code Playgroud)

但是0.1并没有完全用浮点表示,所以我预计它不是真的.我是否幸运,错误恰好小于eps,所以它被舍入为1?

MATLAB实现了IEEE 754,所以我认为它应该适用于所有语言.但这篇文章让我觉得它可能是MATLAB特有的东西.

Sim*_*rne 9

您的具体示例适用于使用IEEE754浮点运算的任何语言(至少64位).

文字0.1是完全正确的

0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)

10.0 正好是10

因此他们的产品

1.000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)

两个最接近的浮点值是:

1.0
1.000000000000000222044604925031308084726333618164062
Run Code Online (Sandbox Code Playgroud)

其中第一个是最接近的,所以结果四舍五入到那个.

(我不是100%肯定你链接到的那个例子中发生了什么:我怀疑它与使用更高中间精度的 C#有关)

但总的来说,这种事情并非如此.例如0.51255*1e5,不是51255(虽然MATLAB可能在打印时撒谎,试试0.51255*1e5-51255).