Pra*_*eth 10 java floating-point floating-accuracy
在Java中,没有精确表示浮点运算.例如这个java代码:
float a = 1.2;
float b= 3.0;
float c = a * b;
if(c == 3.6){
System.out.println("c is 3.6");
}
else {
System.out.println("c is not 3.6");
}
Run Code Online (Sandbox Code Playgroud)
打印"c不是3.6".
我对超过3位小数的精度感兴趣(#.###).我如何处理这个问题来乘以浮点数并可靠地比较它们?
bob*_*bah 19
它是浮点数不应该像进行比较的一般规则(A == B) ,而是喜欢(Math.abs(a-b) < delta)在那里三角洲是一个小数目.
具有十进制形式的固定位数的浮点值不必具有二进制形式的固定位数.
为清晰起见添加:
虽然严格的==浮点数的比较具有非常小的实际意义上说,严格的<和>比较,相反,是一个有效的用例(实施例-当某些值超过阈值的逻辑触发:(val > threshold) && panic();)
如果您对固定精度数字感兴趣,您应该使用固定精度类型BigDecimal,而不是像固有的近似(虽然高精度)类型float.Stack Overflow上有许多类似的问题,可以通过多种语言更详细地介绍这些问题.
我认为它与Java无关,它发生在任何IEEE 754浮点数上。这是因为浮点表示的性质。使用IEEE 754格式的任何语言都将遇到相同的问题。
正如上面David所建议的,您应该使用java.lang.Math类的abs方法来获取绝对值(除去正/负号)。
您可以阅读以下内容:http : //en.wikipedia.org/wiki/IEEE_754_revision,而且好的数字方法教科书也可以充分解决该问题。
public static void main(String[] args) {
float a = 1.2f;
float b = 3.0f;
float c = a * b;
final float PRECISION_LEVEL = 0.001f;
if(Math.abs(c - 3.6f) < PRECISION_LEVEL) {
System.out.println("c is 3.6");
} else {
System.out.println("c is not 3.6");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26044 次 |
| 最近记录: |