为什么我得到这个精度错误?

时间:2014-05-01 05:28:43

标签: java

这是我用来计算百分比并将其四舍五入到2位小数的代码。然而,目前,结果为45.0%而不是45.33%

int one = 432;
int rolls = 953;

double test1 = 100 * one / rolls;
double finalValue1 = Math.round( test1 * 100.0 ) / 100.0;

为什么没有显示小数位?

4 个答案:

答案 0 :(得分:0)

您可以使用String.format(“%。2f”,test1)。如果你使用round,那么java将舍入整数值。因此,以这种方式格式化将为您提供所寻求的答案。

答案 1 :(得分:0)

当你乘以整数时,test1的结果是整数
所以你必须说
double test1= 100.0*one/rolls;
double test1=(double)100*one/rolls

答案 2 :(得分:0)

问题出在以下几行:

double test1 = 100 * one / rolls;

这是因为100onerolls的类型为int

执行100 * one时,会产生43200。然后,我们必须执行剩余的计算... 43200 / 953实际上等于45.330535152,但因为它们都是int类型,结果将是45。制作test1 = 45。由于测试一是双,因此它实际上是45.0

由于上述原因,使用test1的下一次计算将被关闭,从而导致"无十进制值"。

要解决此问题,您可以将onerolls的类型更改为加倍。

答案 3 :(得分:-2)

您有两个问题。

首先,您正在执行整数除法

double test1 = 100 * one / rolls;

100onerolls都是int。这意味着无论您声明返回类型是什么,结果都是整数。这个问题包含在问题Why the result of 1/3=0 in java?中:

  

结果变量为double只会导致在分割后发生隐式转换。

如果你想要double s,请使用双打:

double one = 432.0;
double rolls = 953.0;

在确定之后,Math.round( test1 * 100.0 ) / 100.0;的分区将产生double,但可能有两个以上的精确位置。目前还不清楚如果你想进一步舍入到特定的精度,但如果你只想打印十进制后的两位数你可以使用:

System.out.printf("%.2f", finalValue1);