Java 双精度损失

Java 双精度损失,java,double,Java,Double,我有点困惑,因为我总是失去准确性 也许我用的是错误的类型。我有一个类似“100.00”的字符串。但当我这么做的时候 Double.parseDouble(“100.00”)它被切断为100。我需要帮助。提前谢谢 您可能使用System.out.println(d)打印了您的号码。它将在内部调用Double.toString(Double),其规范说明 m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与dou

我有点困惑,因为我总是失去准确性

也许我用的是错误的类型。我有一个类似“100.00”的字符串。但当我这么做的时候

Double.parseDouble(“100.00”)它被切断为100。我需要帮助。提前谢谢


您可能使用
System.out.println(d)
打印了您的号码。它将在内部调用
Double.toString(Double)
,其规范说明

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与double类型的相邻值


这是因为
double
数字没有“十进制精度”的概念。它是一个具有固定二进制精度的二进制数(二进制点后的二进制位数)。

您可能使用
System.out.println(d)
打印数字。它将在内部调用
Double.toString(Double)
,其规范说明

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与double类型的相邻值


这是因为
double
数字没有“十进制精度”的概念。它是一个具有固定二进制精度的二进制数(二进制点后的二进制位数)。

只需使用BigDecimal而不是Double,如下所示:

BigDecimal houndred = new BigDecimal("100.00").setScale(2, BigDecimal.ROUND_HALF_UP);

BigDecimal一点也不影响精度。此外,您还可以根据需要设置比例、精度和舍入模式。

只需使用BigDecimal而不是Double,如下所示:

BigDecimal houndred = new BigDecimal("100.00").setScale(2, BigDecimal.ROUND_HALF_UP);

BigDecimal一点也不影响精度。此外,您还可以根据自己的喜好设置比例、精度和舍入模式。

这不会降低精度。这只是格式不同。它可能没有被切断,而是在打印时被忽略,因为它不添加信息。除此之外,正如卡亚曼所说,这并不是精度的损失。精度损失大约是161.0*0.7=112.69999,而不是112.7。在二进制中,您认为
100
100.00
(在
double
中)之间的区别是什么?您正在将包含“人类可读精度”的
字符串转换为
double
。双精度
没有“精度”,因为它总是尽可能精确。如果要将
double
值显示为
字符串
。。。这就是你需要再次包含“精度”的地方。你能告诉我们你是如何得出结论的,即变量中没有存储
100
而不是
100.00
?这并没有失去精度。这只是格式不同。它可能没有被切断,而是在打印时被忽略,因为它不添加信息。除此之外,正如卡亚曼所说,这并不是精度的损失。精度损失大约是161.0*0.7=112.69999,而不是112.7。在二进制中,您认为
100
100.00
(在
double
中)之间的区别是什么?您正在将包含“人类可读精度”的
字符串转换为
double
。双精度
没有“精度”,因为它总是尽可能精确。如果要将
double
值显示为
字符串
。。。这就是您需要再次包含“精度”的地方。您能否告诉我们,您是如何得出结论的,
100
而不是
100.00
未存储在变量中的?在PostGreSql数据库中,它在哪种类型的字段中被保存为“100”而不是“100.00”?因为如果不是字符串字段,则100和100.00之间的差异不是实数,因为它们是同一实数的两种表示形式。在PostGreSql数据库中,它在哪种类型的字段中保存为“100”而不是“100.00”?因为如果不是字符串字段,那么100和100.00之间的差值就不是实数,因为它们是同一实数的两个表示形式。