【问题标题】:How to use set up decimal precision for all double type numbers in a large C++ program如何在大型 C++ 程序中为所有双精度类型数字设置小数精度
【发布时间】:2011-12-11 00:52:27
【问题描述】:

如何在大型 C++ 程序中为所有 double 类型的数字使用设置的小数精度。

我可以使用stringstream 和setprecision(n) 来执行此操作,但我必须为整个程序中的每个double 数字一个接一个地执行此操作。

如何在全局范围内一次性完成,以便程序中的所有double 类型数字在小数点后都有固定的十进制数字(例如4)?

我不想使用函数调用导致调用开销。

谢谢

【问题讨论】:

  • 正如我之前回答的,您无法更改双精度数的精度:它就是这样。所以恐怕我不明白这个问题。是否要将双精度值截断到小数点后第四位?或者您想定义一个行为类似于 double 但有 4 个固定小数位的类型?
  • 我想要后者。所以,我使用了 stringstream 和 setprecision 以及
  • 效率不高,看我的新回答。

标签: c++ floating-point double precision


【解决方案1】:

double 类型并非旨在做你想做的事:它是浮点十进制类型,而不是固定十进制类型。您需要的是某种十进制类型,但不幸的是 C++ 还没有这种类型。

它可以在大多数时候用整数类型来模拟,你假设它代表一个单位的千分之一。你只需要小心乘法和除法来固定比例。加法和减法自动工作。

【讨论】:

【解决方案2】:

setprecision 不会改变双精度值的精度,而只是转换成字符串时使用的精度。

并且将双精度数转换为字符串是相对昂贵的操作,因此单个额外函数调用的开销应该可以忽略不计。如果您在性能关键代码中使用双字符串转换,那么您做错了。

我的建议是编写一个函数,例如:

std::string FmtDbl(double d)
{
    std::ostringstream os;
    os << std::setprecision(4) << d;
    return os.str();
}

并在需要转换的任何地方使用该功能。

【讨论】:

  • 谢谢,但是你的函数还需要对字符串进行双精度转换,然后我需要从你函数的返回值再次将字符串转换为双精度。它也有调用开销。为什么你的功能更高效?谢谢
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2019-07-13
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多