我正在寻找将Float转换为Double而不损失精度的最佳实践。到目前为止,我仅发现执行此操作的正确方法是将Float转换为String并将String转换为Double。
在搜索Float API时,我偶然发现了这个方法doubleValue()。我以为这是一个静态构造函数,它将从我的Float中返回一个double值,而不会失去精度,但是以下代码的行为类似于强制转换:
public class Main {
public static void main(String[] args) {
Float floatNumber= 4.95f;
Double doubleNumber= floatNumber.doubleValue();
System.out.println(doubleNumber);
}
}
输出为4.949999809265137
从Float API中搜索有关此内容的其他任何文档,但是我找不到任何文档可以告诉我调用该方法时到底发生了什么。有人知道吗?或者有人可以确认所有方法是否都将我的Float转换为double并将其取消装箱?
最佳答案
使用浮点时,会出现舍入错误,可以通过舍入结果(假设您知道所需的精度)来“校正”舍入错误。 BigDecimal通过始终知道精度来处理此问题。
float floatNumber= 4.95f;
double doubleNumber = (double) floatNumber;
System.out.println("After cast " + doubleNumber);
System.out.printf("Show two decimal places. %.2f%n", doubleNumber);
doubleNumber = Math.round(doubleNumber * 100) / 100.0;
System.out.println("After rounding to two places " + doubleNumber);
版画
After cast 4.949999809265137
Show two decimal places. 4.95
After rounding to two places 4.95