Java将浮点数转换为两倍而不损失精度
我有一个原始浮点数,需要作为原始双数。简单地将浮标转换为两倍会给我带来额外的精度。例如:
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
有没有比String返回更好的方法了?
回答:
这并不是说你实际上获得了更高的精度-而是浮标没有准确地代表你最初瞄准的数字。双被精确地表示原始浮子; toString
显示的是已经存在的“额外”数据。
例如(假设这些数字不正确,我只是在编造东西),假设你有:
float f = 0.1F;double d = f;
则值f可能恰好是0.100000234523。d
将具有完全相同的值,但是当你将其转换为字符串时,它将“信任”精度更高的精度,因此不会尽早进行四舍五入,并且你会看到“多余的数字”在那里,但是对你隐藏。
当你转换为字符串并返回时,最终将得到一个比原始浮点数更接近字符串值的双精度值-但这仅在你真的相信字符串值是你真正想要的值时才有用。
你确定float / double是此处使用的合适类型,而不是BigDecimal
?如果你尝试使用具有精确十进制值的数字(例如,货币),则BigDecimal
是更合适的IMO类型。
以上是 Java将浮点数转换为两倍而不损失精度 的全部内容, 来源链接: utcz.com/qa/412638.html