我知道这个问题是很多反复,但请看看语句第一比马克它已经回答了:)截断双精度到2位小数?
用于截断双重价值2位小数我使用的大多是随处提到的两个方面。下面
//this one
DecimalFormat dtime = new DecimalFormat("#.##");
return Double.valueOf(dtime.format(val));
//or the one below
BigDecimal bd = new BigDecimal(val);
BigDecimal rounded = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
return rounded.doubleValue();
给他们的问题是,对于这两种方式我主要是在数据集中获得正确的四舍五入值。但奇怪的是,我同时获得了2.00000000000005或19.97999999999这样的值。
我没有得到的问题是,为什么只有几个值没有被舍入。什么可能是错的?
[浮点可能重复不准确](http://stackoverflow.com/questions/4575643/floating-point-inaccuracies) – Ingo 2013-04-04 18:31:49
投票结束:你不明白关于双精度/浮点精度的其他5786问题的答案。回去再读一遍。 – Ingo 2013-04-04 18:32:42
你会得到“价值如”2.00000000000005,或者你得到2.00000000000005?如果你得到19。例如,9800000000000004,这可能是由于将四舍五入的值转换为二进制浮点引起的。正如其他答案中所解释的,这种转换会导致一些错误。如果得到2.00000000000005,那么还有一些其他问题,因为已经舍入为2.00的值在转换为浮点时将保持2。在后者情况下,Ingo以不正当的方式投票将其视为重复。 – 2013-04-04 18:39:12