【发布时间】:2021-11-19 10:53:31
【问题描述】:
下面是一个程序,它应该计算小数点后双精度值的位数。在输入一些双精度值时,程序往往会启动一个无限循环(可能是由于浮点不精确)。我不想使用任何包装方法(包括 String 类)。有人可以为某些输入的无限循环提供解释并提供解决方案吗?
import java.util.*;
class Flt
{
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
System.out.print("Enter a double number: ");
double f = sc.nextDouble();
double tmp = f;
int len = 0;
while(tmp != (int) tmp)
{
tmp *= 10;
len++;
}
System.out.println(len);
}
}
【问题讨论】:
-
一个很可能的原因是浮点精度问题。最简单和最强大的解决方案实际上是使用
BigDecimal或字符串表示。除此之外,您可以尝试使用阈值来比较这些值(即,如果绝对差小于 0.0000001,则认为它们相等 - 您需要找到一个合理的值)。但是请注意,即使是涉及double的单个计算也已经可以更改小数位数(0.12345 * 10 已经是 1.2345000000000002)。 -
Java 的
double格式使用二进制浮点格式,因此它没有正确的小数位。尝试计算小数位是对浮点运算工作原理的误解。
标签: java floating-point double precision floating-accuracy