【问题标题】:How to set precision of a float如何设置浮点数的精度
【发布时间】:2012-02-09 15:08:09
【问题描述】:

谁能解释一下如何使用 C 函数选择浮点数的精度?

例子:

theFatFunction(0.666666666, 3) 返回 0.667

theFatFunction(0.111111111, 3) 返回 0.111

【问题讨论】:

标签: c floating-point precision


【解决方案1】:

您不能这样做,因为精度取决于数据类型(即float 或double 或long double)。如果您想将其四舍五入以进行打印,您可以在printf() 中使用正确的格式说明符,即printf("%0.3f\n", 0.666666666)。

【讨论】:

    【解决方案2】:

    你不能。精度完全取决于数据类型。你有 float 和 double 就是这样。

    【讨论】:

      【解决方案3】:

      浮点数具有静态、固定的精度。你不能改变它。有时您可以做的是对数字进行四舍五入。

      请参阅 this page,并考虑按 10 的幂进行缩放。请注意,并非所有数字都可以精确地表示为浮点数。

      【讨论】:

      • 你可以做 floor(x*100)/100.0
      【解决方案4】:

      大多数系统都遵循 IEEE-754 浮点标准,该标准定义了几种浮点类型。

      在这些系统上,float 通常是 IEEE-754 binary32 单精度类型:它具有 24 位精度。 double 是 binary64 双精度类型;它具有 53 位精度。位数的精度由 IEEE-754 标准定义,不能更改。

      当您使用 fprintf 系列的函数(例如 printf)打印浮点类型的值时,精度定义为最大有效位数,默认设置为 6 位。您可以在转换规范中使用. 后跟十进制数来更改默认精度。例如:

      printf("%.10f\n", 4.0 * atan(1.0));  // prints 3.1415926536
      

      而

      printf("%f\n", 4.0 * atan(1.0));     // prints 3.141593
      

      【讨论】:

        【解决方案5】:

        大概有以下几个步骤:

        1. 将 0.666666666 与 0.0005 相加(我们得到 0.667166666)
        2. 乘以 1000(我们得到 667.166666)
        3. 将数字转换为 int(我们得到 667)
        4. 将其移回浮动(我们得到 667.0)
        5. 除以 1000(我们得到 0.667)

        谢谢。

        【讨论】:

          【解决方案6】:

          精度由数据类型决定(即 float 或 double 或 long double)。

          如果您想将其四舍五入以进行打印,您可以在 printf() 中使用正确的格式说明符,即

          printf("%0.3f\n", 0.666666666)  //will print 0.667 in c
          

          现在,如果您想将其四舍五入以进行计算,您必须先将浮点数乘以 10^ 位数,然后类型转换为 int ,进行计算,然后再次类型转换为浮点数并除以 10 的相同幂

          float f=0.66666; 
          f *= 1000;  // 666.660
          int i = (int)f; // 666
          i = 2*i;  //  1332
          f = i;   //  1332
          f /= 1000;  // 1.332
          printf("%f",f);  //1.332000
          

          【讨论】:

            猜你喜欢
            • 2014-09-30
            • 2012-06-23
            • 1970-01-01
            • 2010-12-22
            • 1970-01-01
            • 1970-01-01
            • 2011-10-03
            • 1970-01-01
            • 2016-07-14
            相关资源
            最近更新 更多