我有一个非常接近1的双倍值。如何将其强制转换为1? 我这样做
double myValue = 0.9999;
double a = Math.round(myValue);
int intValue = (int)a;
但即使myValue在[0.5,1]范围内,它也会返回1,所以我失去了精度。我希望它仅在myValuse如此接近1(exp:0.999)时返回1,并且当myValue为0.6时它不应返回1.
感谢您的帮助
答案 0 :(得分:6)
Math.round
专为此而设计。如果你想做一些不同的事情,你必须自己编写代码。
例如,如果您希望将.8
及更高版本舍入为1而不是.5
及更高(请参阅下面有关负数的说明):
double myValue = 0.9999;
int base = (int)Math.floor(myValue);
double remainder = myValue - base;
int intValue = remainder >= .8 ? base + 1 : base;
在那里,我们:
Math.floor
)放入基础,截断小数部分remainder
base
.8 >=
添加一个
醇>
显然,你必须选择你所在的点,因为你想要的东西不是.5。
如果你想处理负数,那就更复杂了,因为Math.floor
总会走向正无穷大。因此,您可能必须在myValue
的标志上分支并在负数时使用Math.ceil
,并相应地调整myValue - base
。然后是关于同一种截止是否适用或者是否对称的整个问题?该截止值应该是-0.8还是-0.2?我会以你想要的方式处理负值...
那就是说,这感觉比应该更复杂。也许像what's described in Dawood ibn Kareem's comment这样的东西可以用于你正在尝试做的事情。 (处理否定时可能必须是+ 0.3
而不是- 0.3
。或者不是。)
答案 1 :(得分:1)
尝试类似:
final double threshold = 0.0001;
if (Math.abs(a - 1) < threshold)
intValue = 1;
else
intValue = 0;
当intValue
为&#34时,这会将1
设置为a
;足够接近1&#34; (即,在{1}}的{1}}内,并将threshold
设置为intValue
,否则(如果它不在阈值范围内,则希望将其四舍五入为0
)。
您可以调整阈值以收紧或放松它将处理的1左右的范围。
或者,如果您希望舍入到0
,如果它刚好超过给定值,您可以执行以下操作:
1