今天我在 android 代码中遇到了非常异常的错误
Today I am facing very abnormal bug in android code
我正在尝试从 8.6f 值中减去 1.0f,它 returns 我 7.6000004
float temp=8.6f-1.0f;
Log.e("temp",temp+"");
正在打印
7.6000004
这里出了什么问题?我是或 Android ?
像这样的浮点运算并不精确;这是计算机科学中的一个众所周知的问题。另见:https://floating-point-gui.de/basic/
这基本上与有人要求您准确回答“1 除以 3,到小数点后 10 位是多少?”是同一个问题。 - 你能给出的最佳答案是 0.3333333334.
但是 3 * 0.3333333334 = 1.0000000002
这是每个数字系统都存在的限制,只是在不同的情况下。
如果您需要精确的数字,您应该使用 BigDecimal:
import java.math.BigDecimal;
class FloatingPointExample {
public static void main(String[] args) {
// Prints 7.6000004
System.out.println(8.6f - 1.0f);
// Prints 7.6
System.out.println(new BigDecimal("8.6").subtract(new BigDecimal("1.0")));
// Do NOT pass floats to BigDecimal
// Prints 7.6000003814697265625
System.out.println(new BigDecimal(8.6f).subtract(new BigDecimal(1.0f)));
// Do NOT pass doubles to BigDecimal
// Prints 7.5999999999999996447286321199499070644378662109375
System.out.println(new BigDecimal(8.6).subtract(new BigDecimal(1.0)));
}
}
我正在尝试从 8.6f 值中减去 1.0f,它 returns 我 7.6000004
float temp=8.6f-1.0f;
Log.e("temp",temp+"");
正在打印 7.6000004 这里出了什么问题?我是或 Android ?
像这样的浮点运算并不精确;这是计算机科学中的一个众所周知的问题。另见:https://floating-point-gui.de/basic/
这基本上与有人要求您准确回答“1 除以 3,到小数点后 10 位是多少?”是同一个问题。 - 你能给出的最佳答案是 0.3333333334.
但是 3 * 0.3333333334 = 1.0000000002
这是每个数字系统都存在的限制,只是在不同的情况下。
如果您需要精确的数字,您应该使用 BigDecimal:
import java.math.BigDecimal;
class FloatingPointExample {
public static void main(String[] args) {
// Prints 7.6000004
System.out.println(8.6f - 1.0f);
// Prints 7.6
System.out.println(new BigDecimal("8.6").subtract(new BigDecimal("1.0")));
// Do NOT pass floats to BigDecimal
// Prints 7.6000003814697265625
System.out.println(new BigDecimal(8.6f).subtract(new BigDecimal(1.0f)));
// Do NOT pass doubles to BigDecimal
// Prints 7.5999999999999996447286321199499070644378662109375
System.out.println(new BigDecimal(8.6).subtract(new BigDecimal(1.0)));
}
}