【问题标题】:Round last 2 digits of double舍入 double 的最后 2 位数字
【发布时间】:2015-12-14 12:32:55
【问题描述】:

我有一个像这样的双重:

0.04251789

它应该看起来像这样:

0.04251700

无论最后两位是什么,都应该用00代替; 重要的是最后两位数字不会丢失,而是由 00 代替。

所以这个:

0.042517

会错的。

最快的方法是什么?

【问题讨论】:

  • 所以它只是为了展示?
  • 它被发送到 WebAPI 并且他们希望它恰好有 8 位数字。转换为字符串不是一种选择。
  • 假设 API(基于 Web)不想要不可移植的二进制数据,您必须迟早将其转换为字符串。并且四舍五入后,只需在创建字符串时指定正确的字段宽度和精度即可。
  • 那么 API 想要一个 8 位浮点数而不是字符串?
  • 你想要的都是不可能的。双精度数不包含“一定数量的数字”。它包含(通常)53 位尾数、一个符号位和 10 位指数。当您将其转换为字符串时,您可以指定位数,但作为双精度数,0.5 和 0.50000000 之间没有区别。

标签: c++ double rounding


【解决方案1】:

我有一个像这样的双重:

0.04251789

它应该是这样的:

0.04251700

您想四舍五入到最接近的1.0 / 1000000。可以这样做:

double d = 0.04251789;
double rounded = std::floor(f * 1000000) / 1000000;

所以这个:

0.042517

会错的。

double 转换为字符串时只需指定正确的精度。你想要 8 位数字,所以:

std::printf("%.8f", rounded);

转换为字符串不是一种选择。

这与您要求数字必须尾随零相矛盾。尾随(和前导)零仅在数字的文本表示中有意义。

【讨论】:

    【解决方案2】:

    所以这是一个 c-way,它不是最好的,但我应该做你想做的。

    int main( void ) {
        double number = 0.04251789;
        char buffer[10];
        snprintf(buffer, sizeof(buffer), "%g", number);
        buffer[8] = '0';
        buffer[9] = '0';
        std::cout << "Converted Number: " << buffer << std::endl;
    }
    

    输出应该是Converted Number: 0.04251700

    我也尝试过使用字符串,但他似乎减少了一些数字,我不知道如何禁用它。但如果你想尝试 c++ 风格,请尝试 std::to_string() 方法。

    【讨论】:

      【解决方案3】:

      因为它需要是字符串,否则你将无法显示零,c-解决方案可能是:

      char temp[128];
      memset(temp,'\0',sizeof(temp));
      sprintf(temp,"%10.8f",0.04251789);
      temp[strlen(temp)-1]='0';
      temp[strlen(temp)-2]='0';
      printf(temp);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        相关资源
        最近更新 更多