【发布时间】:2012-01-31 08:06:08
【问题描述】:
简而言之 - 我很难处理剩余的浮动
(即 10.00000123 而不是 10)
我来了:
我需要生成具有恒定间隙的浮点列表,如下所示 (实际上它是一张地图,我需要检索对象,但没关系)
列表 A:0.25、0.5、0.75、1、...
或
列表 B:0.01, 0.02, 0.03, 0.04, ...
每次我得到一个数字时,我都会将它四舍五入到列表中最近的单元格。
假设我得到 0.051 来检索列表 A 中的单元格 - 我返回 0.05。
假设我得到 0.21 来检索列表 B 中的单元格 - 我返回 0.25。
所以我开始这样做了
float a = Math.round(Value / step) * step;
但比我得到很多时间 0.2500001 (float leftovers ) 我需要一个聪明的方法来解决它。
也许通过取点后面的位数然后再做一次
Math.round(Value / 100) * 100;?
有没有更聪明的方法? 我试过doig这个
final float factor = Math.round(1 / step);
final float value = (float) Math.round(value * factor) / factor;
但我有时会有这样的列表
列表 A:10, 15, 20, 25, 30, ...
当我得到 22 时,我检索了 20 的单元格。 问题是当我得到 10 的差距时
Math.round(1 / baseAssetStep)
返回 0 - 我得到 NaN
【问题讨论】:
-
是否需要四舍五入?如果打印它们是问题,您可以将浮动保留原样并简单地以特定精度打印。例如,
String.format("%.4f",2.142133);将精确地四舍五入... -
当你想要精确的数字时使用 BigDecimal
-
四舍五入是必须的。我需要知道有多少小数位。可以说我得到 o.25f 。我需要知道它是 2 位数字。但是如果我得到 0.25000001 怎么办? \
标签: java floating-point rounding