Java 如何转换为整数和don';不要失去精度

Java 如何转换为整数和don';不要失去精度,java,int,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 感谢您的帮助尝试以下方法: final double threshol

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

感谢您的帮助

尝试以下方法:

final double threshold = 0.0001;
if (Math.abs(a - 1) < threshold)
    intValue = 1;
else
    intValue = 0;
是专门为此设计的。如果你想做一些不同的事情,你必须自己编写代码

例如,如果希望
.8
和更高的数值舍入为1,而不是
.5
和更高的数值(请参见下面关于负数的注释):

在那里,我们:

  • 将整数部分(
    Math.floor
    )放入基数,截断小数部分
  • 仅将小数部分放入余数中
  • 如果小数部分为
    =
    .8,则在
    基中添加一个
  • 显然,你必须选择取整的点,因为你想要的不是。5

    如果你想处理负数,那就更复杂了,因为它总是朝着正无穷远的方向发展。因此,您可能必须在
    myValue
    符号上进行分支,并在负数时使用(并相应地调整
    myValue-base
    )。还有一个问题是,同样的截止线是适用的,还是对称的?截止值应该是-0.8还是-0.2?我将以你想要的方式处理负值作为你的练习


    这就是说,这感觉比它应该是更复杂。也许像这样的事情对你正在努力做的事情有用。(在处理底片时,可能必须是
    +0.3
    而不是
    -0.3

    您还期望什么?@amani92 0.7怎么样?0.8? 0.9? 0.95? 0.99? 规则是什么?@amani92那么:规则是什么?任何低于0.9的值都四舍五入到0,任何介于0.9和1之间的值都四舍五入到1?@DawoodibnKareem:我一直试图说服自己,这是可行的,而不是我下面复杂的解决方案。我想它会。。。也许可以充实一下(通过测试证明它在一系列值上都有效),然后作为答案发布?@T.J.Crowder我不相信在提问者明确要求之前回答问题。在这种情况下,我一点也不清楚amani92到底想要什么——特别是当涉及到更大的数字时。所以我想提醒她,让她澄清她的要求。如果她不这样做,她就得不到我的回答。谢谢u@t.J.Crowder,但我正在寻找一种更简单的方法precision@amani92:祝你好运。这个要求是不寻常的,上面的要求也不那么复杂。(但同样:根据您的实际需求,可能会提供一种更简单的方法。)您完全不清楚为什么认为0.9应该变成0,但0.99应该变成1。这肯定不是一个更“精确”的结果。恰恰相反。这不是标准API的一部分是有原因的。这没有多大意义。
    if (a >= 0.9999)
        intValue = 1;
    else
        intValue = 0;
    
    double myValue = 0.9999;
    int base = (int)Math.floor(myValue);
    double remainder = myValue - base;
    int intValue = remainder >= .8 ? base + 1 : base;