在C中舍入浮点数

时间:2017-07-18 12:42:44

标签: c floating-point rounding

我需要将存储为浮点的一些数字舍入。

值类似于:0.000000123,例如代表123ns

我需要提取123(这样可以用ns表示)并将其四舍五入到下一个“十”。

所以,例如我想要exctract:130e-9

你有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果可以忽略对评论中出现的浮点的担忧,那么这个想法会将给定的数字乘以它大于1。然后通过乘以100获得该点之后的其他数字,然后根据需要继续。

 double a; // is given a non-zero for example 0.0000000123...
 double num = a;
 while(num < 1.)
 {
      num *= 10;
 } // at the end of the while 1.23...
 num *= 10; //12.3...
 int result = ((int)num)*10 + 10; // 130

result就是你想要的。它的单位取决于具体情况。

然而,它在计算级别上有一些错误。如您所知,计算是在基数2中进行的,基数10中的所有这些计算都可能在基数2中有一些计算错误。要找到它,您可以按照this issue进行计算。 因此,您可以在算法视图中看到此代码。

答案 1 :(得分:1)

有几种方法可以rounding,但听起来你正在寻找向上舍入(向+无穷大),也称为ceil

由于你有几秒的单位而你想要得到10ns的单位,你需要除以10ns(1e-8,与乘以1e8相同)然后使用ceil函数。例如

double val = 123e-9;
int val10ns = ceil(val*1e8);

(这假设你有c99 ceil,如果没有看到here的实现)

然后,如果你想把它作为一个字符串输出,你只需要转换&#39; val10ns&#39;并附加&#34; 0ns&#34;,像这样

printf("val in units of 10ns: %d0ns\n", val10ns);

最后,您可能想要做一些事情来处理小值。例如,1e-90秒仍然可以达到10ns。例如,你可以先做一个零到零来获得ns的单位,然后做一个ceil来获得10ns的单位。