我看到的是:
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)?
它在文档中的哪个位置指定?托斯特林爪哇并没有真正的帮助(至少我)。
我确实在语言规范中看到了这一点:
浮点和双精度类型的元素是可以分别使用IEEE 754 32位单精度和64位双精度二进制浮点格式表示的值。
维基百科的IEEE 754文章给出了这个:
这给出了从6到9个有效十进制数字的精度(如果具有最多6个有效十进制数字的十进制字符串被转换为IEEE 754单精度,然后被转换回相同数量的有效十进制数字,则最终的字符串应该与原始字符串匹配;
问题2
所以这似乎就是754个浮子Java /IEEE工作方式?
我可以保证浮点数/字符串转换/表示的准确性,最多可以达到一定的位数(如“p”和“q”),如果超过该位数Java将对显示进行一些舍入(如“r”)?
谢谢你的帮助。
来自JLS,4.2.4。浮点运算:
Java编程语言要求浮点运算的行为就像每个浮点运算符将其浮点结果舍入到结果精度一样。不精确的结果必须四舍五入到最接近无限精确结果的可表示值;如果两个最近的可表示值相等接近,则选择其最低有效位为零的值。这是IEEE 754标准的默认舍入模式,称为舍入到最近。
Java编程语言在将浮动值转换为整数时使用舍入归零(§5.1.3),在这种情况下,它的作用就像数字被截断一样,丢弃尾数位。舍入归零在其结果中选择格式值最接近且大小不大于无限精确结果的值。
感谢mttdbrd...这很有帮助。从你的第一段,我认为我的问题的答案是:是的,Java按照IEEE规范在内部进行这种舍入。
这是一个程序的输出,让我看到了一点舍入的作用:
-------------------------------------------
string 1.49999
bigdec of float 1.499989986419677734375
float back to str 1.49999
-------------------------------------------
string 1.4999991
bigdec of float 1.49999904632568359375
float back to str 1.499999
-------------------------------------------
string 1.4999992
bigdec of float 1.49999916553497314453125
float back to str 1.4999992
-------------------------------------------
string 1.4999993
bigdec of float 1.4999992847442626953125
float back to str 1.4999993
-------------------------------------------
string 1.4999994
bigdec of float 1.49999940395355224609375
float back to str 1.4999994
-------------------------------------------
string 1.4999995
bigdec of float 1.499999523162841796875
float back to str 1.4999995
-------------------------------------------
string 1.4999996
bigdec of float 1.49999964237213134765625
float back to str 1.4999996
-------------------------------------------
string 1.4999997
bigdec of float 1.49999964237213134765625
float back to str 1.4999996
-------------------------------------------
string 1.4999998
bigdec of float 1.4999997615814208984375
float back to str 1.4999998
-------------------------------------------
string 1.4999999
bigdec of float 1.49999988079071044921875
float back to str 1.4999999
-------------------------------------------
string 1.15
bigdec of float 1.14999997615814208984375
float back to str 1.15
-------------------------------------------
string 1.49999964237213134765626
bigdec of float 1.49999964237213134765625
float back to str 1.4999996
如果有人想要,以下是该计划:
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);
}
还有一些其他链接,以防它们对其他研究这些东西的人有帮助:
我认为这是描述您正在查看的行为的Javadoc的相关部分(来自静态String toString(浮点数)
方法):
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
问题内容: 这是我正在查看的内容: 因此,我知道不能完全用二进制表示“ p” 1.15的十进制值。 因此,大的十进制大“ bdp”输出对我来说非常有意义……这是浮点数的实际值。 问题1 当浮点数“ p”转换回字符串以进行输出(如1.15)时,如何四舍五入(从内部1.149..375到1.15)? 在文档中的什么地方指定?toString javadoc并没有真正帮助(至少对我来说)。 我在语言规范
问题内容: 正如标题所说。我不认为有可能这样做,但如果可以告诉我。 这是我正在编写的bukkit(minecraft服务器)插件所必需的。我要执行一个命令:tnt [power]。电源是我想转换为浮点数的返回字符串。 谢谢 问题答案: 用于进行转换。 和之间的区别只是回报。如果需要(对象),请使用前者;如果要数字,请使用后者。
问题内容: http://golang.org/pkg/strconv/ http://play.golang.org/p/4VNRgW8WoB 如何将浮点数转换为字符串格式?这是google游乐场,但未获得预期的输出。(2e + 07)我想得到“ 21312421.213123” 请帮助我从浮点数中获取字符串。谢谢 问题答案: 试试这个 如果只想获得尽可能高的位数精度,则特殊精度-1使用所需的最
我正在尝试将一个包含“4,3”这样的数字的列转换为数据类型string。 ValueError:无法将字符串转换为浮点数:“4,3”
问题内容: 我有一个表,其中包含纬度和经度值,这些值存储为要转换为的字符串()。 但是,使用或似乎没有一种直接的方法。 如何轻松转换这些列?这是一次转换。 问题答案: 原来我只是在描述上不见了: 将值转换为DECIMAL数据类型。可选参数M和D指定十进制值的精度(M指定位数的总数)和小数位数(D指定小数点后的位数)。默认精度是小数点后两位。 因此,以下查询有效:
如何将字符串百分比转换为浮点小数?我写了这段代码,当我运行它时,我只会返回一些错误,如“无法将系列转换为”