双常量的比较
Comparison of Double Constants
我对此进行了很多研究,我对双打的精度误差有所了解;但是我找不到答案。我的问题是:比较双精度常量 总是 安全吗?我的意思是,只是从字符串中读取双精度值或在源代码中创建。不会对它们进行任何操作(加、减等)。如果我创建一个像
这样的变量
双 c = 3.0.
下面的等式是否永远成立? c==3.0000.
例如,是否有可能看到像这样的方程式的错误评估 1.23456789 < 1.23456788?
For example is there any possibility to see wrong evaluation of an equation like this 1.23456789 < 1.23456788?
是的,这是可能的,因为您可以编写具有任意位数的浮点文字,并且当它们被编译器解释时,这些将被近似为适合 double
的最接近的值.
例如:
boolean result = 1.2003004005006007008009 > 1.2003004005006007008008;
System.out.println(result);
打印 false
,即使在数学上第一个数字大于第二个数字(因此您希望它打印 true
)。
结论:通过使用浮点字面值,您不会突然拥有任意精度的浮点数。
总是安全的;有一个警告。
这是一个例子:
1.232342134214321412421 == 1.232342134214321412422
即正确;所有 double 常量都默默地四舍五入到最接近的可表示双精度,并且对于这两个数字,它是相同的双精度。
因此,给定 2 个实际的数学数字 A 和 B,其中 A < B
,然后如果将这些数字转换为双精度文字并 运行 这 3 个表达式,您将得到以下场景:
如果 A 和 B 舍入为不同的双精度值,您将得到保证:
A < B
将为真
A == B
将为假
A > B
将为假
如果 A 和 B 真的很接近,他们可能会四舍五入到相同的两倍,你会得到:
A < B
将为假
A == B
将为真
A > B
将为假
换句话说,'less than' 和 'greater than' 可以弯曲成相等,但较小的数字永远不会被错误地视为较大。
我对此进行了很多研究,我对双打的精度误差有所了解;但是我找不到答案。我的问题是:比较双精度常量 总是 安全吗?我的意思是,只是从字符串中读取双精度值或在源代码中创建。不会对它们进行任何操作(加、减等)。如果我创建一个像
这样的变量双 c = 3.0.
下面的等式是否永远成立? c==3.0000.
例如,是否有可能看到像这样的方程式的错误评估 1.23456789 < 1.23456788?
For example is there any possibility to see wrong evaluation of an equation like this 1.23456789 < 1.23456788?
是的,这是可能的,因为您可以编写具有任意位数的浮点文字,并且当它们被编译器解释时,这些将被近似为适合 double
的最接近的值.
例如:
boolean result = 1.2003004005006007008009 > 1.2003004005006007008008;
System.out.println(result);
打印 false
,即使在数学上第一个数字大于第二个数字(因此您希望它打印 true
)。
结论:通过使用浮点字面值,您不会突然拥有任意精度的浮点数。
总是安全的;有一个警告。
这是一个例子:
1.232342134214321412421 == 1.232342134214321412422
即正确;所有 double 常量都默默地四舍五入到最接近的可表示双精度,并且对于这两个数字,它是相同的双精度。
因此,给定 2 个实际的数学数字 A 和 B,其中 A < B
,然后如果将这些数字转换为双精度文字并 运行 这 3 个表达式,您将得到以下场景:
如果 A 和 B 舍入为不同的双精度值,您将得到保证:
A < B
将为真A == B
将为假A > B
将为假
如果 A 和 B 真的很接近,他们可能会四舍五入到相同的两倍,你会得到:
A < B
将为假A == B
将为真A > B
将为假
换句话说,'less than' 和 'greater than' 可以弯曲成相等,但较小的数字永远不会被错误地视为较大。