【发布时间】:2023-12-29 05:13:01
【问题描述】:
我有一个基于float 的存储十进制,按它们的自然数字。 float 的精度可以满足我的需要。现在我想要使用double 对这些数字执行一些更精确的计算。
一个例子:
float f = 0.1f;
double d = f; //d = 0.10000000149011612d
// but I want some code that will convert 0.1f to 0.1d;
更新 1:
我很清楚 0.1f != 0.1d。这个问题与精确的十进制计算无关。可悲的是,这个问题被否决了。我会再解释一遍...
假设我使用的 API 返回 float 十进制 MSFT 股票价格的数字。信不信由你,这个 API 存在:
interface Stock {
float[] getDayPrices();
int[] getDayVolumesInHundreds();
}
众所周知,MSFT 股票的价格是一个十进制数字,不超过 5 位,例如31.455、50.12、45.888。显然,该 API 不适用于 BigDecimal,因为仅仅通过价格将是一个很大的开销。
假设我想以double 精度计算这些价格的加权平均值:
float[] prices = msft.getDayPrices();
int[] volumes = msft.getDayVolumesInHundreds();
double priceVolumeSum = 0.0;
long volumeSum = 0;
for (int i = 0; i < prices.length; i++) {
double doublePrice = decimalFloatToDouble(prices[i]);
priceVolumeSum += doublePrice * volumes[i];
volumeSum += volumes[i];
}
System.out.println(priceVolumeSum / volumeSum);
我需要decimalFloatToDouble 的高性能实现。
现在我使用下面的代码,但我需要一个更聪明的东西:
double decimalFloatToDouble(float f) {
return Double.parseDouble(Float.toString(f));
}
【问题讨论】:
-
您无法获得
0.1f或0.1d。在this paper 中了解原因。 -
如果您需要精确度,请使用
BigDecimal。 -
我不需要精确的小数精度。我只需要将 0.1f 转换为 0.1d、1.1f 转换为 1.1d、1.234f 转换为 1.234d 等等。
-
@Keppil:它在哪里说的?
-
据我了解,您的浮点数与已知具有不超过 5 个有效数字的十进制表示的数字最接近。您想要最接近该十进制表示的双精度。我认为您将不得不在此过程中的某个时刻转换为十进制,以便您可以获得所需的小数舍入。如果有的话,聪明是对代码质量的负面影响。你能解释一下你不喜欢你当前代码的地方吗?
标签: java floating-point decimal floating-point-precision floating-point-conversion