Java printf浮点数整数部分未按预期格式化问题咨询
Java浮点数格式化问题解析
1. 小数部分与预期不符的原因
Double是二进制浮点数类型,无法精确表示所有十进制小数。你定义的12345.12345在二进制浮点数中只能存储近似值,实际存储的数值为12345.123046875,这就是格式化后小数部分偏差的根本原因。如果需要精确的十进制数值处理,建议替换为BigDecimal类型。
示例修改代码(使用BigDecimal):
package streams; import java.math.BigDecimal; public class streams { public static void main(String[] args) { BigDecimal myDecimal = new BigDecimal("12345.12345"); System.out.printf("%20.10f ok %n", myDecimal); System.out.printf("%-20.10f ok %n", myDecimal); System.out.printf("%020.10f ok %n", myDecimal); } }
2. 整数部分格式化不符合预期的原因
你误解了printf格式符的宽度参数:%10.10f中的第一个10是输出内容的总宽度(包含整数、小数点、小数部分的所有字符),而非仅整数部分的宽度。
你的预期输出中,12345.1234500000的总长度为5(整数)+1(小数点)+10(小数)=16位,因此需要将总宽度设为大于16的数值(比如20)才能实现预期的对齐效果:
%20.10f:总宽度20,右对齐,前面补空格%-20.10f:总宽度20,左对齐,后面补空格%020.10f:总宽度20,前面补0填充
修改后的代码运行后,输出将符合你的预期:
12345.1234500000 ok 12345.1234500000 ok 000012345.1234500000 ok
内容的提问来源于stack exchange,提问作者Prerak Jain
相关产品推荐
相关产品推荐

