如何转换为整数并且不会丢失精度

时间:2017-07-28 09:00:56

标签: java int

我有一个非常接近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.

感谢您的帮助

2 个答案:

答案 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;

Live Example

在那里,我们:

  1. 将整数部分(Math.floor)放入基础,截断小数部分
  2. 只将小数部分放入remainder
  3. 如果小数部分为base .8
  4. ,请向>=添加一个

    显然,你必须选择你所在的点,因为你想要的东西不是.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