Ste*_*ong 93 java floating-point double
我有一个原始的浮点数,我需要作为一个原始的双.简单地将浮子铸造成双倍会给我带来奇怪的额外精度.例如:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
Run Code Online (Sandbox Code Playgroud)
但是,如果不是强制转换,我将float作为字符串输出,并将字符串解析为double,我得到我想要的:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Run Code Online (Sandbox Code Playgroud)
有没有比去String更好的方法呢?
Jon*_*eet 118
这并不是说你实际上得到了额外的精确度 - 浮动并没有准确地代表你原本想要的数字.双被精确地表示原始浮子; toString显示已经存在的"额外"数据.
例如(并且这些数字不对,我只是在制作)假设你有:
float f = 0.1F;
double d = f;
Run Code Online (Sandbox Code Playgroud)
那么值f可能正好是0.100000234523.d将具有完全相同的值,但是当您将其转换为字符串时,它将"信任"它准确到更高的精度,因此不会尽早完成,并且您将看到已经已经"额外数字"在那里,但隐藏在你身边.
当你转换为一个字符串并返回时,你最终会得到一个双倍值,它比原始浮点数更接近字符串值 - 但是如果你真的相信字符串值是你真正想要的那样,那就更好了.
你确定float/double是在这里使用的合适类型而不是BigDecimal吗?如果您正在尝试使用具有精确十进制值的数字(例如金钱),那么这BigDecimal是一种更合适的IMO类型.
Bre*_*man 35
我发现转换为二进制表示更容易理解这个问题.
float f = 0.27f;
double d2 = (double) f;
double d3 = 0.27d;
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(f)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d2)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d3)));
Run Code Online (Sandbox Code Playgroud)
您可以通过向末尾添加0来看到浮点数扩展为double,但是0.27的双重表示"更准确",因此问题.
111110100010100011110101110001
11111111010001010001111010111000100000000000000000000000000000
11111111010001010001111010111000010100011110101110000101001000
Run Code Online (Sandbox Code Playgroud)
eri*_*son 25
这是由于合同Float.toString(float),部分说:
小数部分必须打印多少位数[...]?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个, 更多的数字才能唯一地将参数值与float类型的相邻值区分开来.也就是说,假设x是由此方法为有限非零参数f生成的十进制表示所表示的精确数学值.那么f必须是最接近x的浮点值; 或者,如果两个浮点值等于x,则f必须是其中之一,f的有效位的最低有效位必须为0.
小智 13
我今天遇到过这个问题,并且无法对BigDecimal使用重构,因为该项目非常庞大.但是我找到了解决方案
Float result = new Float(5623.23)
Double doubleResult = new FloatingDecimal(result.floatValue()).doubleValue()
Run Code Online (Sandbox Code Playgroud)
这很有效.
请注意,调用result.doubleValue()会返回5623.22998046875
但是调用doubleResult.doubleValue()会正确返回5623.23
但我不完全确定它是否是正确的解决方案.
使用a BigDecimal而不是float/ double.有许多数字不能表示为二进制浮点数(例如0.1).因此,您必须始终将结果舍入为已知精度或使用BigDecimal.
有关更多信息,请参见http://en.wikipedia.org/wiki/Floating_point.
小智 6
我找到了以下解决方案:
public static Double getFloatAsDouble(Float fValue) {
return Double.valueOf(fValue.toString());
}
Run Code Online (Sandbox Code Playgroud)
如果使用float和double而不是Float和Double,请使用以下命令:
public static double getFloatAsDouble(float value) {
return Double.valueOf(Float.valueOf(value).toString()).doubleValue();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
197938 次 |
| 最近记录: |