获取双变量中的数字的问题

我的java程序中需要一个函数,我遇到了一个小问题。 我想查看一个’double’变量的总位数。 (例如:5应该返回1,5.0034应该返回5,而2.04应该返回3.)我的function是这样的:

private int getDoubleLength (double a) { int len = 0; while (a != (int) a) { a *= 10; } while (a > 1) { len ++; a/=10; } System.out.println(String.format("Double %f has %d digits.",a,len)); return len; } 

现在这种方法很完美,但是当我进行一些数学计算时,你会得到双重的轻微错误:我将10除以cos(60),即0,5。 答案应该是20.0,但程序给出了20.000000000000004(这个数字,我复制了它)。 我的while循环卡住,程序挂起。

有任何想法吗? (或其他检查数字数字的好方法!)

之后的双打和浮点数和操作并不精确,因此与代数计算相比总会出现轻微的误差。 如果您正在使用余弦等,那么您将始终必须处理这些舍入错误,任何数字分析的书籍或网络文本都应该描述。 如果您使用简单的aritmetic操作,请查看java.lang.BigDecimal

有关如何存储浮点值的详细信息。请参阅每个计算机科学家应该知道的关于浮点运算的内容

toString()。length()应该解决它
记得减去’。’ 如果它在那里,不应该被计算在内

这就是我实现我的方法,当double是一个带有指数表示的大返回String时,Simple转换为String。 即20000000将返回2.0E + 7,然后拆分将从此处拆分导致错误计数。 我曾经使用BigDecimaltoPlainString()方法

 protected int countDecimalDigits(Double d) { BigDecimal deci = BigDecimal.valueOf(d); int integerPlaces = 0; int decimalPlaces = 0; String text = deci.toPlainString(); String[] integerDecimalSplit = text.split("\\."); if (null != integerDecimalSplit[0]) { integerPlaces = integerDecimalSplit[0].length(); } if (integerDecimalSplit.length > 1) { decimalPlaces = integerDecimalSplit[1].length(); } return integerPlaces + decimalPlaces; } 

这是一个四舍五入的问题。 我会使用字符串,计算字符数,并决定哪些数字是重要的。