Java(Eclipse)中如何输出指定精度的十进制数0.123456789123456789?
解决Java中精确输出19位十进制小数的问题
首先得戳破核心问题:float和double是二进制浮点数,天生没法精确存储所有十进制小数。你要的目标值0.123456789123456789有19位有效数字,但float最多只能保留6-7位有效精度,double也只有15-17位——也就是说,当你把这个数存进float或double的时候,原始值就已经被近似截断了,后面再怎么调格式符都是白搭,因为数据本身已经丢了精度。
要解决这个问题,你得用Java里的BigDecimal类,它是专门为精确十进制运算设计的,能完整存储你需要的所有小数位。关键是初始化的时候必须用字符串构造器,不能用double转(不然还是会带过来二进制浮点数的近似误差)。
给你写个可直接运行的例子:
import java.math.BigDecimal; import java.text.DecimalFormat; public class PreciseDecimalOutput { public static void main(String[] args) { // 重点:用字符串初始化BigDecimal,确保数值完全精确 BigDecimal exactValue = new BigDecimal("0.123456789123456789"); // 方式一:用DecimalFormat自定义格式,保证输出19位小数 DecimalFormat decimalFormat = new DecimalFormat("0.0000000000000000000"); System.out.println(decimalFormat.format(exactValue)); // 方式二:用String.format,指定30位总长度+19位小数(和你之前尝试的格式符适配) System.out.println(String.format("%030.19f", exactValue)); } }
运行这段代码,就能得到你想要的0.123456789123456789了。
额外提醒:如果你的数值是从用户输入、数据库读取等场景获取的,一定要以字符串形式传递给BigDecimal,别先转成double再传——不然double的近似误差会直接带进BigDecimal里,还是达不到精确输出的效果。
内容的提问来源于stack exchange,提问作者Yang Gyeonghwan
相关产品推荐
相关产品推荐

