我知道 float 和 double 不准确。我有这样的问题。
double a=4.0/2.0;
System.out.println(a);
输出为2.0。那么结果到底准确与否。 这个问题是我读《Java 编程语言》这本书时提出的。 它向我展示了一种设置输出比例的方法。
System.out.println((int)(area*100)/100.0);
该语句将输出设置为小数点后两位。而且我知道浮点运算不准确。那么该语句是否始终有效?
最佳答案
在第一种情况下,结果将恰好是 2.0。原因是 4.0 和 2.0 都可以精确地表示为 Java double 。除法运算符返回最接近实数除法结果的 double ,即 2.0。
在第二种情况下,是否得到准确的结果将取决于面积的值。所有可精确表示的两位小数 double 均以 0.00、0.25、0.50 或 0.75 结尾。剩下的两位小数 double 只能近似。
转换为int
会导致不准确,应该用Math.round替换。问题是,比整数稍小的正 double 向下转换为下一个整数,但四舍五入到最接近的整数。这是说明此问题的程序:
导入java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
double area = 0.29;
System.out.println(new BigDecimal(area));
System.out.println(new BigDecimal(area*100));
System.out.println(new BigDecimal((int)(area*100)/100.0));
System.out.println((int)(area*100)/100.0);
System.out.println(Math.round(area*100)/100.0);
}
}
输出:
0.289999999999999980015985556747182272374629974365234375
28.999999999999996447286321199499070644378662109375
0.2800000000000000266453525910037569701671600341796875
0.28
0.29
最接近 0.29 的 double 比它略小,乘以 100 的结果也略小于 29。转换为 int 得到 28,但舍入得到 29。
关于java - 如果一个 double 的结果能被另一个 double 整除是准确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731902/