我已经测试了大约一个小时,我不明白发生了什么。
在imageJ中,如果我说:
i = 3.5;
print(round(i));
我得到4
。
但是,如果我说:
print(65535/(27037-4777)*(26295-4777));
print(round(65535/(27037-4777)*(26295-4777)));
出于某种原因,我得到了:
63350.5
63350
它不应该四舍五入到63351吗?
答案 0 :(得分:1)
看一下您的评论,通过该计算生成的数字实际上是63350.499999...
,因此当您尝试回合时,数字会向下舍入并得到63350
。我可以建议的一件事是添加一个在后见之明似乎无害的小常量,但它会解决这样的情况。您希望将其设置得足够小,以便将数字的小数部分推到0.5
范围,以便它成功完成,但它不会干扰{{1} 1}}适用于其他小数部分。
Java API有一个名为round
的函数,它将计算在您指定的特定浮点数之后的下一个可能的小数组件。但是,由于Math.ulp
没有此功能,因此请考虑添加类似ImageJ
的小内容。这可能看起来像是一个愚蠢的黑客,但这肯定会避免像你现在经历的那种情况。您添加的此常量也不会影响1e-5
中round
的工作方式。
ImageJ
:为您的号码添加一个小常量(如tl;dr
)然后再舍入。这不应该影响1e-5
整体的工作方式,并且只是将那些悬停在round
标记处的小数组件推送到真正超过0.5
的数字上