使用最多两位小数

时间:2011-07-02 01:28:30

标签: java double

我想使用双精度到2位小数。即,它将被存储最多2个小数位,如果比较两个双值,则比较应仅基于前2个小数位。怎么实现这样的事情?我的意思是存储,比较,一切都将基于前两位小数。其余的地方可能不同,大于,小于,无关紧要。

修改 我的价值观并不大。比如最多从0到5000。但是我必须多次乘以Cos A,Sin A,其中A的值在程序过程中不断变化。

修改 在我的程序中看一辆汽车以特定速度移动,比如说12米/秒。现在每隔几分钟,汽车改变方向,就像选择一个新的角度一样,开始沿着那个方向沿直线移动。现在每次移动,我都必须在地图上找到它的x和y位置。这将是currentX + velocity * Cos A和currentY + Velocity * Sin A.但由于这种情况经常发生,因此随着时间的推移会出现很多累积误差。如何避免?

5 个答案:

答案 0 :(得分:12)

比较浮点值是否应该始终使用某种形式的delta / epsilon比较:

if (Abs(value1 - value2) < 0.01 )
{
   // considered equal to 2 decimal places
}

答案 1 :(得分:2)

请勿使用float(或double)。例如,它不能代表所有两位小数字。另一方面,您可以使用intlong获得相同(但准确)的效果。只是假装数十和一列真的是十分之一和百分之一列。如果需要将结果输出到屏幕,则总是可以除以100.0,但是对于比较和幕后工作,整数存储应该没问题。您甚至可以使用BigInteger获得任意精度。

答案 2 :(得分:1)

要保留2个小数位的值,请使用BigDecimal类,如下所示:

private static final int DECIMAL_PLACES = 2;

public static void main(String... args) {
    System.out.println(twoDecimalPlaces(12.222222)); // Prints 12.22
    System.out.println(twoDecimalPlaces(12.599999)); // Prints 12.60
}

private static java.math.BigDecimal twoDecimalPlaces(final double d) {
    return new java.math.BigDecimal(d).setScale(DECIMAL_PLACES, 
        java.math.RoundingMode.HALF_UP);
}

答案 3 :(得分:1)

要舍入到小数点后两位,您可以使用round

public static double round2(double d) {
     return Math.round(d * 100) / 100.0;
}

这只能完成一半。

注意:double中的十进制值可能不是精确表示。直接或间接使用Double.toString(double)时,它会进行少量舍入,因此数字将按预期显示。但是,如果您使用此号码并执行操作,则可能需要再次对该号码进行舍入。

答案 4 :(得分:0)

  

最多可存储2位小数   地方

不可能。浮点数不会具有小数位数。他们在点之后有二进制位置。

您有两种选择:

(a)根据dlev的回答,不要使用浮点数,特别是使用BigDecimal;

(b)在执行输出时设置所需的精度,例如通过DecimalFormat,一个定义小数精度的SQL列等

您还应该好好了解What every computer scientist should know about floating-point