我碰到了Java的一个奇怪角落(对我来说似乎很奇怪)
double dd = 3.5;
float ff = 3.5f;
System.out.println(dd==ff);
o / p:是
double dd = 3.2;
float ff = 3.2f;
System.out.println(dd==ff);
o / p:错误
我观察到,如果我们将任意两个值(如我在示例中提到的float和double)与.5
OR
进行比较,例如.0
3.5、234.5、645.0,则输出为true
即两个值相等,否则输出为false
相等。
甚至我都试着做方法,strictfp
但是没有运气。我错过了什么吗?
看一下每位计算机科学家应该了解的浮点数。
将无限多个实数压缩为有限数量的位需要近似表示…。
-–编辑以显示以上引用的意思—
您不应该比较浮点数或双精度数是否相等。因为,您不能真正保证分配给float或double的数字是准确的。
所以
float x = 3.2f;
不会导致浮点值为3.2。结果是浮点值为3.2,加上或减去一些非常小的误差。说3.19999999997f。现在很明显为什么比较不起作用了。
要比较浮点数是否相等,您需要检查该值是否“足够接近”相同的值,如下所示
float error = 0.000001 * second;
if ((first >= second - error) || (first <= second + error)) {
// close enough that we'll consider the two equal
...
}
问题内容: 如果我使用像这样的比较(a是int,b和c是float / double)是否安全: 它可能听起来很荒谬,但是在我的旧编程语言中,有时1 + 2 == 3是错误的(因为左侧返回2.99999999999 …)。而且,这呢: 问题答案: 通常,由于不能精确地将许多十进制数字表示为or 值,因此这样做并不安全。经常陈述的解决方案是测试数字之间的差异是否小于某个“小”值(在数学文献中通常用希
这是一个Java代码,应该测试小数点后的前三位是否相同。而我需要编写这个程序没有一个主方法。
问题内容: float数据类型是单精度32位IEEE 754浮点,double数据类型是双精度64位IEEE 754浮点。 这是什么意思?我什么时候应该使用float而不是double? 问题答案: 总结一下: float用32位表示,带有1个符号位,8位指数和23位有效数(或从科学记号中得出的结果:2.33728 * 10 12; 33728为有效数)。 double 用64位表示,带有1个符号
float数据类型是单精度32位IEEE 754浮点,而double数据类型是双精度64位IEEE 754浮点。 这是什么意思?什么时候应该使用float而不是double或者相反呢?
编译器会为我们处理epsilon的问题吗? 顺便问一句:对照Epsilon检查时写<或<=更好吗?
问题内容: Java中float和double的范围包括什么? 为什么不建议在精度要求很高的地方使用float或double? 问题答案: Java的类的成员包含类型的Min和Max值。 检出的和静态最终成员。 (有些)人们会建议不要在精度和精度至关重要的事情上使用浮点类型,因为舍入误差可能会使可测量(少量)的量不起作用。