我正在寻找将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

10-02 09:46
查看更多