这段代码有什么问题?

时间:2012-07-28 10:07:05

标签: java numbers

String phrase = "4556.44";
Float num = new Float(phrase);
int dollars = (int) Math.floor(num);
System.out.println(""+dollars);
int cent = (int) Math.floor((num - dollars) * 100.0F);
int cent2 =  (int) ((num - dollars) * 100.0);
System.out.println(""+cent+":"+cent2);

这是一个数字到Word类的代码短语,我的问题是,当我运行此代码片段时,输出结果为4556.43。但输入值为4556.44。请告诉我为什么会发生这种情况,我需要答案才能解决这个问题。

6 个答案:

答案 0 :(得分:2)

对于使用受控舍入的高精度计算,请使用BigDecimal代替Float

答案 1 :(得分:1)

浮点数不如双精度精确,后者不如BigDecimal精确。

使用绝对必须精确的程序(如财务应用程序)时,请使用BigDecimal。

如果这是一个小作业和非关键应用程序,你可以试试Double,看看它是否足够精确。

答案 2 :(得分:0)

int cent = (int)(num * 100f % 100f);

答案 3 :(得分:0)

Float不是精确计算的好选择。

 int cent = (int) Math.floor((num - dollars) * 100.0F);

代码中的上述陈述并没有像您期望的那样准确地给出答案。

如果可能,请尝试使用DoubleBigInteger

答案 4 :(得分:0)

Floats和Doubles不能代表所有可能的实数,因为他们使用specification通过添加以下任何数字来组成数字:1,1 / 2,1 / 4,1 / 8,1 / 16等...

如果你试试0.1f+0.1f+0.1f==0.3f,你就会变得虚假。因此,正如其他人所说,使用BigDecimal,它使用不同的表示,它慢得多,但它不会引起这些问题。

答案 5 :(得分:0)

您还可以执行以下操作

String phrase = "4556.44";
long money = Math.round(Double.parseDouble(phrase) * 100);
long dollars = money / 100;
long cents = money % 100;
System.out.printf("%,d dollars and %d cents%n", dollars, cents);

打印

4,556 dollars and 44 cents