Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何将浮点数转换为字符串_Java_Floating Point - Fatal编程技术网

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);
}
以及一些其他链接,以防它们对其他研究这些东西的人有所帮助:


我认为这是Javadoc的相关部分,它描述了您所看到的行为(从方法):

m或a的小数部分必须打印多少个数字?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能是尽可能多的数字,以唯一区分参数值与float类型的相邻值

换言之:浮点类型的toString方法通常会生成最短的十进制表示,它可以不附带任何条件地标识浮点数的真实值

示例程序说明:

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