我知道浮动和双重不准确。我有这样的问题。
double a=4.0/2.0;
System.out.println(a);
输出为2.0。所以结果是否准确。 问题来自于我阅读Java编程语言一书。 它向我展示了一种设置输出比例的方法。
System.out.println((int)(area*100)/100.0);
语句将输出设置为两位小数。我知道浮点运算不准确。声明总是可以工作吗?
答案 0 :(得分:1)
在第一种情况下,结果将是2.0。原因是4.0和2.0都可以完全代表Java加倍。除法运算符返回与实数除法结果最接近的两倍,即2.0。
在第二种情况下,您是否得到确切结果将取决于区域的值。所有可精确表示的两位小数的双精度数以.00,.25,.50或.75结尾。其余两位小数的双打只能近似。
转换为int
导致不准确,应由Math.round替换。问题是,一个正整数略小于一个整数,转换为下一个整数,但舍入到最接近的整数。这是一个说明此问题的程序:
import 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的两倍略小于它,乘以100的结果也略小于29.铸造到int得到28,但是舍入得到29。