2016-10-07 117 views
0

我有点困惑,因为我一直失去精度。双精度丢失

也许我操作的类型不对。我有一个像“100.00”的字符串。但是当我做

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

+10

这不会损失精度。这只是格式不同。 – Kayaman

+3

它可能没有被切断,但在打印时被忽略,因为它不会添加信息。除此之外,正如Kayaman已经指出的那样,这不是精确度的损失。精确度的损失可能类似于161.0 * 0.7 = 112.69999,而不是112.7。 – Thomas

+1

在二进制文件中,你认为'100'和'100.00'之间的区别是什么? –

回答

4

您可能已打印您的电话号码System.out.println(d)。它将在内部呼叫Double.toString(double),其规格状态为

必须为m或a的小数部分打印多少位数?必须至少有一位数字来表示小数部分,并且除此之外还需要多少位数,但只需要多少位数来唯一地区分参数值和类型为double的相邻值。

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

+0

在PostGreSql数据库中,它被保存为“100”而不是“100.00” – Moonstar

+0

在什么类型的字段中?因为如果它不是字符串字段,则100和100.00之间的差异不是实数,因为它们是相同实数的两个表示。 –

+0

我明白了。谢谢。是的,字符串表示必须改变... – Moonstar

0

只需使用BigDecimal的,而不是双这样的:不是在所有

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

的BigDecimal不松动的精度。另外,您可以根据自己的喜好设置比例,精度和舍入模式。