双倍乘以int问题

时间:2017-01-23 06:41:25

标签: java android

double temp = 64.1;
System.out.println("Result = " + (temp*1000));

结果将是:

Result = 64099.99999999999

但实际结果应为64100

如果是双数据类型

double a = ((temp * 1000) % (0.5 * 1000));
a=7.275957614183426E-12;

如果将其投射到浮动

((((float) temp) * 1000) % (0.5 * 1000));
a=0.0;

为什么会出现这种情况?

4 个答案:

答案 0 :(得分:3)

是一个典型的数字问题,浮点数,当您多个时,例如double * int。

第一个选项使用Math.round:

Math.round((temp*1000))

第二个选项使用BigDecimal类:

 BigDecimal temp = BigDecimal.valueOf(64.1);
 BigDecimal thousand = BigDecimal.valueOf(1000);
 BigDecimal result = temp.multiply(thousand);

 //example how to extract int or double value 
 int intResult = result.intValue();
 double doubleResult = result.doubleValue();
 System.out.println("Result = " + result);

答案 1 :(得分:0)

我认为你可以使用JAVA的ceil()方法。

double temp = 64.1;

System.out.println(“Result =”+ Math.ceil(temp * 1000));

我希望这会有所帮助。

答案 2 :(得分:0)

Java中的double表示浮点数。它有64位值,包括:

  • 符号位:1位
  • 指数:11位
  • 显着精度:53位(显式存储52位)

来源:https://en.wikipedia.org/wiki/Double-precision_floating-point_format

与固定点数(byte,int,long)不同,浮点数不能始终始终返回完全相同的数字表示。这就是为什么你得到结果64099.99999999999而不是64100的原因。

在Java中使用BigDecimal以便更好地控制小数位。

来源:https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html

答案 3 :(得分:-1)

试试这个

double temp = 64.1;
int x = 1000;
System.out.println("Answer :" + Math.round((temp*x)));