Java如何将浮点数转换为字符串
以下是我所看到的:Java如何将浮点数转换为字符串,java,floating-point,Java,Floating Point,以下是我所看到的: float p=1.15f; BigDecimal bdp=new BigDecimal(p); float q=1.1499999f; float r=1.14999999f; System.out.println(p); //1.15 System.out.println(bdp); //1.14999997615814208984375 System.out.println(q); //1.1499999 System.out.println(r); //
float p=1.15f;
BigDecimal bdp=new BigDecimal(p);
float q=1.1499999f;
float r=1.14999999f;
System.out.println(p); //1.15
System.out.println(bdp); //1.14999997615814208984375
System.out.println(q); //1.1499999
System.out.println(r); //1.15
所以我知道“p”1.15的十进制值不能用二进制精确表示。所以大十进制“bdp”输出对我来说非常有意义。。。这是浮动的实际值 问题1
当浮点“p”被转换回字符串以进行输出(如1.15)时,如何/在何处进行舍入(从内部1.149..375值到1.15) 文件中的具体位置是什么?toString javadoc并没有真正的帮助(至少对我是这样) 我确实在以下方面看到了这一点: float和double类型的元素是可以 使用IEEE 754 32位单精度和64位 分别为双精度二进制浮点格式 给出了: 这将提供6到9个有效十进制数字的精度(如果 最多有6个有效小数的十进制字符串转换为IEEE 754单精度,然后转换回相同数量的 有效小数,则最后一个字符串应与原始字符串匹配 问题2
看来这就是Java/IEEE 754浮动应该如何工作的 我可以保证浮点数/字符串转换/表示的精度达到一定的位数(如“p”和“q”),如果超过了该位数,Java将对显示进行一些舍入(如“r”)
感谢您的帮助。来自JLS,4.2.4.浮点操作: Java编程语言需要浮点运算 就像每个浮点运算符都将其浮点值四舍五入一样 结果到结果精度。不精确的结果必须四舍五入到结果精度 最接近无限精确结果的可表示值;如果 两个最近的可表示值相等接近,一个具有 选择最低有效位零。这是IEEE 754标准的 默认舍入模式称为舍入到最近值 Java编程语言在转换 浮点值为整数(§5.1.3),在本例中,其作用如下 虽然数字被截断,但丢弃尾数位。 向零舍入将在其结果处选择最接近的格式值 在数量上不超过无限精确的结果
感谢mttdbrd…这很有帮助。从你的第一段开始,我想我的问题的答案是:是的,Java按照IEEE规范在内部进行舍入 下面是一个程序的输出,让我看一下四舍五入的作用: 如果有人想要,这里有一个程序:
public static void floatAccuracy3()
{
printFloatAndBigDec("1.49999");
for (int i = 1; i < 10; i++) {
String s="1.499999";
s+=i;
printFloatAndBigDec(s);
}
printFloatAndBigDec("1.15");
printFloatAndBigDec("1.49999964237213134765626");
}
public static void printFloatAndBigDec(String s)
{
Float f=new Float(s);
BigDecimal bdf=new BigDecimal(f);
System.out.println("-------------------------------------------");
System.out.println("string "+s);
System.out.println("bigdec of float "+bdf);
System.out.println("float back to str "+f);
}
publicstaticvoidfloataccuracity3()
{
printFloatAndBigDec(“1.49999”);
对于(int i=1;i<10;i++){
字符串s=“1.499999”;
s+=i;
PrintFloat和BigDec(s);
}
PrintFloat和BigDec(“1.15”);
printFloatAndBigDec(“1.4999996423713134765626”);
}
公共静态void printFloatAndBigDec(字符串s)
{
浮动f=新浮动;
BigDecimal bdf=新的BigDecimal(f);
System.out.println(“-----------------------------------------”;
System.out.println(“字符串”+s);
System.out.println(“浮点的bigdec”+bdf);
System.out.println(“浮回str”+f);
}
以及一些其他链接,以防它们对其他研究这些东西的人有所帮助:
import java.math.BigDecimal;
public class FloatTest {
static void show(float f) {
BigDecimal f_exact = new BigDecimal(f);
System.out.println("---");
System.out.println("String value: " + f);
System.out.println("Exact value: " + f_exact);
System.out.println("Delta: " +
new BigDecimal("1.15").subtract(f_exact));
}
public static void main(String[] args) {
show(1.15f);
show(Math.nextUp(1.15f));
}
}
输出:
---
String value: 1.15
Exact value: 1.14999997615814208984375
Delta: 2.384185791015625E-8
---
String value: 1.1500001
Exact value: 1.150000095367431640625
Delta: -9.5367431640625E-8
除非你正在执行科学。停止使用飘浮。正确。我们在代码中使用双小数。但是我们从另一个系统中获得双倍,并且我需要了解这些细节,这样我就可以确保我正在尽可能精确地处理我所得到的数据。感谢你对这类问题感兴趣,考虑使用<代码>系统。out.println(new BigDecimal(someFloat));以获取
someFloat
的精确十进制表示形式。好的,谢谢,你说得对。我之前读过,但它直到现在才真正单击。
---
String value: 1.15
Exact value: 1.14999997615814208984375
Delta: 2.384185791015625E-8
---
String value: 1.1500001
Exact value: 1.150000095367431640625
Delta: -9.5367431640625E-8