首先将其设为 double。永远不要使用 float 否则您将无法使用 java.lang.Math 实用程序。
现在如果你碰巧事先知道你想要的 precision 并且它等于或小于 15,那么告诉你的 double 行为就变得很容易了。检查以下:
// the magic method:
public final static double makePrecise(double value, int precision) {
double pow = Math.pow(10, precision);
long powValue = Math.round(pow * value);
return powValue / pow;
}
现在,无论何时进行操作,都必须告诉 double 结果行为:
for ( double value = 0.0d; value < 1.0d; value += 0.1d )
System.out.println( makePrecise(value, 1) + " => " + value );
输出:
0.0 => 0.0
0.1 => 0.1
0.2 => 0.2
0.3 => 0.30000000000000004
0.4 => 0.4
0.5 => 0.5
0.6 => 0.6
0.7 => 0.7
0.8 => 0.7999999999999999
0.9 => 0.8999999999999999
1.0 => 0.9999999999999999
如果您需要超过 15 的精度,那么您就不走运了:
for ( double value = 0.0d; value < 1.0d; value += 0.1d )
System.out.println( makePrecise(value, 16) + " => " + value );
输出:
0.0 => 0.0
0.1 => 0.1
0.2 => 0.2
0.3000000000000001 => 0.30000000000000004
0.4 => 0.4
0.5 => 0.5
0.6 => 0.6
0.7 => 0.7
0.8 => 0.7999999999999999
0.9 => 0.8999999999999999
0.9999999999999998 => 0.9999999999999999
注意1:为了提高性能,您应该将Math.pow 操作缓存在一个数组中。为了清楚起见,这里没有做。
NOTE2:这就是为什么我们从不使用 doubles 来表示价格,而是 longs 在最后一个 N 处(即 N