我有一个原始浮点数,我需要一个原始双精度数。简单地将浮点数转换为 double 会给我带来奇怪的额外精度。例如:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
但是,如果不是强制转换,而是将浮点数输出为字符串,并将字符串解析为双精度字符串,我会得到我想要的:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
有没有比去字符串和返回更好的方法?
原文由 Steve Armstrong 发布,翻译遵循 CC BY-SA 4.0 许可协议
这并不是说您 实际上 获得了额外的精度 - 而是浮点数没有准确地表示您最初瞄准的数字。双精度 表示 原始浮点数;
toString
显示已经存在的“额外”数据。例如(这些数字不正确,我只是在编造)假设你有:
那么
f
的值可能正好是 0.100000234523。d
将具有完全相同的值,但是当您将其转换为字符串时,它会“相信”它具有更高的精度,因此不会提前四舍五入,您会看到已经存在但对您隐藏的“额外数字”。当您转换为字符串并返回时,您最终会得到一个双精度值,它比原始浮点数更接近字符串值 - 但只有 当 您真的相信字符串值是您真正想要的值时,这才是好的。
您确定 float/double 是此处使用的合适类型,而不是
BigDecimal
吗?如果您尝试使用具有精确十进制值的数字(例如货币),那么BigDecimal
是更合适的 IMO 类型。