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
。请告诉我为什么会发生这种情况,我需要答案才能解决这个问题。
答案 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);
代码中的上述陈述并没有像您期望的那样准确地给出答案。
如果可能,请尝试使用Double
或BigInteger
。
答案 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