java - Java浮点格式问题
问题描述
我从 XML 文件中检索一个浮点数,我想格式化并插入到文本文件中,模式为逗号后 8 位,前 2 位。
这是我的代码:
String patternNNDotNNNNNNNN = "%11.8f";
float value = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, value);
System.out.println(result);
结果我得到:1.704737 07
如果我使用同样的问题:
java.text.DecimalFormatSymbols symbols = new java.text.DecimalFormatSymbols(java.util.Locale.US);
java.text.DecimalFormat df = new java.text.DecimalFormat("##.########", symbols);
System.out.println(df.format(value));
我不明白为什么我有一个四舍五入的值(1.704737 11到 1.704737 07)。
解决方案
这是因为该值的精度实际上并不float
意味着该值。1.7043711
1.7043711
考虑以下哪个过程1.70473711f
既是 afloat
又是 a double
:
String patternNNDotNNNNNNNN = "%11.8f";
float valueF = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueF);
System.out.println(valueF);
System.out.println(result);
double valueD = 1.70473711f;
result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);
输出:
1.7047371
1.70473707
1.7047370672225952
1.70473707
当将该值视为双精度时,您可以看到它1.7043711f
实际上是1.7047370672225952
. 将其四舍五入到 8 位给出1.70473707
的结果并不 1.70473711
像预期的那样。
相反,将数字视为双精度数(即删除f
),增加精度将产生预期的输出:
double valueD = 1.70473711;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);
输出:
1.70473711
1.70473711
推荐阅读
- shell - 比较两个文件并使用 shell 将两个文件的不同列组合成一个文件
- mysql - 从 MySQL 转换为 PostgresSQL 时分组中的子查询错误
- excel - 机器人框架和 Excel:构建路径不同部分的 Excel 文件的完整路径(打开 Pyxl 库)
- string - 打字稿:强制类型为“字符串文字”而不是
- c# - 鼠标光标处的窗口启动位置
- python - 检查bash脚本文件时如何禁用pylint错误
- sql - Postgresql 计算前 n % 行的值
- android-studio - 在 Fragments 中调用 SharedPreferences
- asp.net-mvc - 添加视图选项在 mvc 中不可用?
- flutter - Flutter 从 UI 中动态插入和删除 `TextFormField`