计算时避免舍入

时间:2019-03-28 11:30:23

标签: java

我在这里有一段Java代码,可以将数字转换为单词,它可以正常工作,但是小数始终比应有的小1。 122.11已打印122.10

这里是一段代码,正在执行计算。 我该如何解决这个问题?

    String phrase = "122.11" ;
    Float num = new Float( phrase ) ;
    int dollars = (int)Math.floor( num ) ;
    int cent = (int)Math.floor( ( num - dollars ) * 100.0f ) ;

2 个答案:

答案 0 :(得分:0)

String phrase = " 555243.22" ;
Double num = new Double( phrase ) ;
double dollarsAsDouble =  Math.floor( num ) ;
double val=num - dollarsAsDouble+0.005;
int cent = (int)Math.floor(val * 100.0f ) ;
int dollars=(int) dollarsAsDouble;
System.out.println(cent);//555234
System.out.println(dollars);//22

或:

String phrase = "122.12" ;
String[] val=phrase.split("\\.");
int dollars=new Integer(val[0]);
int cent=0;
if(val.length>1)
    cent=new Integer(val[1]);

System.out.println(cent);
System.out.println(dollars);

或:

String phrase = "555243.22" ;
BigDecimal num = new BigDecimal(phrase);
num.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal result = num.subtract(new BigDecimal(num.longValue()));
System.out.println((int)(result.doubleValue()*100.0)); // 22
System.out.println(num.intValue());//555243

答案 1 :(得分:0)

0.11不能精确地用浮点运算来表示,最终在内部是0.1099999(至少在我的机器上是0.10999999999999943,但这应该是通用的)。乘以100并将其取整,您将得到10。您可以通过舍入100倍的数字来轻松地规避此问题,而不是对其取整,只需在要舍入的数字上加上0.5。而且,您可以跳过Math.floor(),因为将数字强制转换为int已经可以满足您的要求:

int cent = (int)( ( num - dollars ) * 100.0f + 0.5f) ;