我需要使用标准的“math.h”中点舍入行为将 64 位双精度值舍入到我的代码中最接近的 uint64_t。其中一些数字具有以下属性:
我注意到标准库舍入函数没有“未签名”版本。另外,我怀疑当中间双精度值太大而无法放入尾数时,人们用来执行此操作的一些技巧将不再起作用。
进行这种转换的最佳方法是什么?
最简单的舍入方法是转换为目标类型:
假设您想要将 2.3 舍入到整数根,那么您可以执行以下操作:
return (int) 2.3;
Run Code Online (Sandbox Code Playgroud)
所以,一般来说,你会:
return (destination_type) x;
Run Code Online (Sandbox Code Playgroud)
然而,这里有一个总是向下舍入的问题,正如您在 2.7 示例中看到的那样:
return (int) 2.7;
=> yields 2
Run Code Online (Sandbox Code Playgroud)
如果要四舍五入到最接近的,则需要加上0.5,然后四舍五入:
return (int) (2.7 + 0.5);
=> yields 3
Run Code Online (Sandbox Code Playgroud)
因此,当您想要使用最接近的舍入舍入到任何目标类型时,您需要:
return (destination_type) (x + 0.5);
Run Code Online (Sandbox Code Playgroud)