Java 如何准确打印指定的双精度值?

Java 如何准确打印指定的双精度值?,java,double,decimal,precision,Java,Double,Decimal,Precision,以下代码打印121134111222254500: Double value = 12113411122222.545421d; System.out.println(String.format("%f", value)); 如何使变量值分配给要打印的确切值-1211341112222.545421 更新:我应该在一开始就这么说-我知道在需要精度时需要使用bigdecimic。然而,我使用的是一个库,它读取特定类型的文件,其结果是我从该文件中获取了一组属性。其中一个属性从第

以下代码打印
121134111222254500

Double value = 12113411122222.545421d;
System.out.println(String.format("%f", value));
如何使变量
分配给要打印的确切值-
1211341112222.545421


更新:我应该在一开始就这么说-我知道在需要精度时需要使用
bigdecimic
。然而,我使用的是一个库,它读取特定类型的文件,其结果是我从该文件中获取了一组属性。其中一个属性从第三方库以双精度形式传递给我。之后,我将属性值发送到数据库,结果属性值被保存为
1.2113411122222545E13
,因为值被转换为
字符串。因此,现在我正在寻找一个解决方案,如何“丢失”指数部分,并做出假设:如果
Double.MAX_值
1.7976931348623157E308
,那么这意味着我可能会得到带有大量十进制数的属性值,例如
1211341112222.54211212212d
,我如何将
Double
转换为
String
,而不“丢失”任何数字。我怀疑这是由于
Double
的精度问题,但这是违反直觉的,因为
Double.MAX_值
1.7976931348623157E308
。我想需要更好地了解Java和计算机系统中的数字的内部工作,才能理解这个问题。

您使用了错误的数据类型。使用double时,小数分隔符后不能存储那么多数字。您应该选择一个
BigDecimal
编辑:


我希望我能帮助你。

改用
BigDecimal
double
s本质上是不精确的。64位double没有这个范围,它们基本上最多可以使用15位。如果你想有这么高的精度,你需要另一个数据类型。你不能
double
没有足够的精度来表示您分配的数字。Java double是一种精度有限的浮点类型。如果有太多的有效数字,则会丢失一些信息,并重新开始四舍五入。使用BigDecimal可获得更好的精度。或者,如果只传输值,而不做数学,考虑使用字符串而不是双。你不能避免这一点,而且如果你依赖它被精确地表示,这确实是bug的来源。例如,这样的浮点文本被标记为问题。您的代码没有编译,提示为FYIThanks。我已经修好了。这应该可以编译…是的,它现在可以编译了,但是它给出了错误的结果。你应该传递一个字符串,而不是一个双精度字符串,这样它才能工作。好的,我们得到了我们的解决方案。谢谢你的帮助。:)Sry我有一个Qwertz/德语键盘布局。我只能说“不是”。
String number = "12113411122222.545421";
BigDecimal value = new  BigDecimal(number);
System.out.println(String.format("%f", value));