java - 优雅地删除浮动剩余物

Bic*_*ick 3 java floating-point rounding

简而言之 - 我很难将浮动过剩
(即10.00000123而不是10)

我来啦 :

我需要生成具有恒定间隙的浮动列表,如下所示(实际上它是一个地图,我需要检查对象螺母,没关系)

清单A:0.25,0.5,0.75,1,......

清单B:0.01,0.02,0.03,0.04 ......

每次我得到一个数字,然后我把它绕到列表中的neerest单元格.
让我说我得到0.051来检索列表A中的一个单元格 - 我返回0.05.
让我说我得到0.21来检索列表B中的一个单元格 - 我返回0.25.

所以我开始这样做了

float a = Math.round(Value / step) * step;
Run Code Online (Sandbox Code Playgroud)

但是我得到了很多时间0.2500001(浮动剩余物)我需要一个聪明的方法来绕它.

也许通过获取点后的位数再做一次

Math.round(Value / 100) * 100;?
Run Code Online (Sandbox Code Playgroud)

有更聪明的方法吗?我试过这个

        final float factor = Math.round(1 / step);
        final float value = (float) Math.round(value * factor) / factor;
Run Code Online (Sandbox Code Playgroud)

但我有时会有这样的清单

清单A:10,15,20,25,30 ......

当我得到22时,我会检查20的细胞.问题是当我得到10的间隙时

Math.round(1 / baseAssetStep) 
Run Code Online (Sandbox Code Playgroud)

返回0 - 我得到NaN

Pet*_*ang 6

BigDecimal而不是float.


Java教程基本数据类型:

float: [...]此数据类型不应用于精确值,例如货币.为此,您需要使用 java.math.BigDecimal类.Numbers和Strings涵盖了Java平台提供的BigDecimal和其他有用的类.