将 Double 类型转换为 long 类型,而不会失去精确值

8

我有一个 Double 对象,当转换为 long 值时,会失去精确值。

Double d = 1.14*100
    
System.out.println(d.longValue());

上述语句将打印: 113。 我希望打印114

4
浮点数并非精确。您想先四舍五入吗? - Tim S.
1
请注意,您认为的Double值114在内部实际上可能是113.99999999...,因此您的代码最终只截断小数部分。正如Tim S建议的那样,您需要加入四舍五入。 - hatchet - done with SOverflow
4
如果您想防止代码失去精度,可能应该使用 BigDecimal - Pshemo
1
重复:https://dev59.com/-nRC5IYBdhLWcg3wXPsC - Tarik
同意@Pshemo的观点--除非有充分的理由使用“Double”,否则最好使用“BigDecimal”。 - Reinstate Monica -- notmaynard
4个回答

7
如果您需要确切的114值,您需要使用Math.round:
double d = 1.14*100;
System.out.println(Math.round(d));

4

如果您需要表示您期望的整数/长整数值,可以使用以下方法:

Math.round(1.14 * 100)

4
请尝试以下操作:
Long.parseLong( String.format( "%.0f",doublevalue ) ) ;

1
首先,double 不是精确的。接下来,在将 double/float 强制转换为 long/int 时,小数部分会被舍弃(而不是四舍五入)。
要获得最近的值,您需要对其进行四舍五入。
System.out.println(Math.round(d));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接