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

ama*_*i92 -2 java int

我有一个非常接近1的双倍值.如何将其转换为1?我这样做

 double myValue = 0.9999;
 double a = Math.round(myValue);
 int intValue = (int)a;
Run Code Online (Sandbox Code Playgroud)

但即使myValue在[0.5,1]的范围内,它也会返回1,所以我失去了精度.我希望它仅在myValuse如此接近1(exp:0.999)时返​​回1,并且当myValue为0.6时它不应返回1.

谢谢你的帮助

T.J*_*der 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;
Run Code Online (Sandbox Code Playgroud)

实例

在那里,我们:

  1. 获取整数number(Math.floor)到基数,截断小数部分
  2. 只获得小数部分 remainder
  3. base如果小数部分是>=.8 ,则加1

显然,你必须选择你所在的点,因为你想要的东西不是.5.

如果你想处理负数,那就更复杂了,因为它Math.floor总会走向正无穷大.因此,您可能必须在标志上分支myValueMath.ceil在负面时使用(并相应地调整myValue - base).然后是完整的问题,即同一种截止是否适用,或者它是否对称?该截止值应该是-0.8还是-0.2?我会以你想要的方式处理负面价值观......

也就是说,这感觉比应该更复杂.也许类似于Dawood ibn Kareem的评论描述的内容可能适用于你想要做的事情.(可能+ 0.3不是- 0.3处理否定时.或者不是.)