【发布时间】:2015-06-02 21:34:51
【问题描述】:
我试图了解浮点运算如何产生不同的输出。下面执行的测试结果为 1;但是 vb.net 和 c# 给出不同的输出,而 java 给出不同的输出。它可能与编译器有关,我读过What Every Computer Scientist Should Know About Floating-Point Arithmetic,但它令人困惑,有人可以用简单的语言解释吗?
VB.NET
Dim x As Single = 1.000001
Dim y As Single = 0.000001
Dim result = x - y
输出:0.9999999 Click here to see output C# 也是如此
另外,在visual studio中查看变量时,结果的值与它输出的值不同,打印时被修剪,只打印了七个9(这是可以理解的),但我不明白实际结果如何他们是0.99999994
更新:好的,我更感兴趣的是这个计算是如何完成的(删除了 java 的东西)
【问题讨论】:
-
简单的答案是浮点只是值的近似值。如果您想获得可预测的结果,请使用 Decimal 数据类型。
-
下面执行的测试结果为 1 所有结果都与 1 不同。你到底是什么意思?如果您对数字是否相等感兴趣,请检查结果的二进制表示。对于 Java,您可以通过 Long.toBinaryString(Double.doubleToRawLongBits(d)) 获得二进制表示
-
@Silvermind 我更新了我的问题更具体,我没有比较浮点数和双精度数
-
使用这个site 你可以看到二进制表示和双精度数字的近似值。对于
1.000001,它给出1.0000009536743164;对于0.000001,它给出0.0000009999999974752427(9.999999974752427e-7),减法的结果给出0.9999999536743189247573,当粘贴在上面给出的链接中时,将他循环到0.99999994(可能是因为简单的精度) -
基本上 1/10 1/100 1/1000 等形式的数字不能用二进制表示。这与浮点/双精度无关 - 无论精度如何,您都无法为这些二进制数字提供精确值。就像 1/3 不能用十进制表示,因为它是 0.3 和无穷大的 3。
标签: java c# .net vb.net compilation