我有一个基于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;
我非常清楚0.1f != 0.1d。这个问题与精确的十进制计算无关。换句话说...
假设我使用一个API返回十进制MSFT股票价格的
float
数字。信不信由你,这个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
。请参考这篇论文了解原因。 - KeppilBigDecimal
。 - shmosel