我想使用双精度到2位小数。即,它将被存储最多2个小数位,如果比较两个双值,则比较应仅基于前2个小数位。怎么实现这样的事情?我的意思是存储,比较,一切都将基于前两位小数。其余的地方可能不同,大于,小于,无关紧要。
修改 我的价值观并不大。比如最多从0到5000。但是我必须多次乘以Cos A,Sin A,其中A的值在程序过程中不断变化。
修改 在我的程序中看一辆汽车以特定速度移动,比如说12米/秒。现在每隔几分钟,汽车改变方向,就像选择一个新的角度一样,开始沿着那个方向沿直线移动。现在每次移动,我都必须在地图上找到它的x和y位置。这将是currentX + velocity * Cos A和currentY + Velocity * Sin A.但由于这种情况经常发生,因此随着时间的推移会出现很多累积误差。如何避免?
答案 0 :(得分:12)
比较浮点值是否应该始终使用某种形式的delta / epsilon比较:
if (Abs(value1 - value2) < 0.01 )
{
// considered equal to 2 decimal places
}
答案 1 :(得分:2)
请勿使用float
(或double
)。例如,它不能代表所有两位小数字。另一方面,您可以使用int
或long
获得相同(但准确)的效果。只是假装数十和一列真的是十分之一和百分之一列。如果需要将结果输出到屏幕,则总是可以除以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。