2
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);

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

4

6 回答 6

2

对于具有受控舍入的高精度计算,请BigDecimal改用Float

于 2012-07-28T10:09:06.570 回答
1

浮点数不如双精度浮点数精度,而双精度浮点数不如 BigDecimal 精度。

在处理绝对必须精确的程序(如金融应用程序)时,请使用 BigDecimal。

如果这是一个小型作业和非关键应用程序,您可以尝试 Double 来查看它是否对您来说足够精确。

于 2012-07-28T10:16:02.713 回答
0
int cent = (int)(num * 100f % 100f);
于 2012-07-28T10:17:56.173 回答
0

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

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

代码中的上述语句并没有像您期望的那样为您提供准确的答案。

如果可能,请尝试使用Double或。BigInteger

于 2012-07-28T10:18:23.163 回答
0

浮点数和双精度数不能表示所有可能的实数,因为它们使用的规范是通过添加以下任何数字来构成数字:1、1/2、1/4、1/8、1/16 等...

如果你尝试0.1f+0.1f+0.1f==0.3f你会得到错误的。因此,正如其他人所说,使用 BigDecimal,它使用不同的表示形式,速度要慢得多,但不会引发这些问题。

于 2012-07-28T10:18:53.870 回答
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
于 2012-07-28T10:28:13.767 回答