基于双函数的字符串的精度

时间:2014-04-05 23:28:26

标签: c++

假设你有一个功能:

string function(){
double f = 2.48452
double g = 2
double h = 5482.48552
double i = -78.00
double j = 2.10
return x; // ***
}
x的

* 我们插入:

if we will insert f, function returns: 2.48
if we will insert g, function returns: 2
if we will insert h, function returns: 5482.49
if we will insert i, function returns:-78
if we will insert j, function returns: 2.1

它们只是示例,它展示了funcion()的工作原理。准确地说: double k返回的函数将其四舍五入为:k.XX, 但对于: K = 2.20 它返回2.2作为字符串。 它是如何实现的?

3 个答案:

答案 0 :(得分:4)

1)仅仅因为你看到两个数字,这并不意味着基础值必须舍入到两位数。

VALUE 的精确度和 FORMATTED OUTPUT 中显示的位数是两个完全不同的东西。

2)如果您正在使用cout,则可以使用“setprecision()”控制格式:

http://www.cplusplus.com/reference/iomanip/setprecision/

示例(来自上面的链接):

// setprecision example
#include <iostream>     // std::cout, std::fixed
#include <iomanip>      // std::setprecision

int main () {
  double f =3.14159;
  std::cout << std::setprecision(5) << f << '\n';
  std::cout << std::setprecision(9) << f << '\n';
  std::cout << std::fixed;
  std::cout << std::setprecision(5) << f << '\n';
  std::cout << std::setprecision(9) << f << '\n';
  return 0;
}

示例输出:

3.1416
3.14159
3.14159
3.141590000

答案 1 :(得分:2)

数学上,2.22.202.2002.2000完全相同,依此类推。如果您想要查看更多无关紧要的零,请使用[setprecision][1]

cout << fixed << setprecision(2);
cout << 2.2 << endl; // Prints 2.20

答案 2 :(得分:0)

要显示最多2个小数位,但不显示尾随零,您可以执行以下操作:

std::string function(double value)
{
  // get fractional part
  double fracpart = value - static_cast<long>(value);

  // compute fractional part rounded to 2 decimal places as an int
  int decimal  = static_cast<int>(100*fabs(fracpart) + 0.5);
  if (decimal >= 100) decimal -= 100;

  // adjust precision based on the number of trailing zeros
  int precision = 2; // default 2 digits precision
  if      (0 ==  decimal)       precision = 0; // 2 trailing zeros, don't show decimals
  else if (0 == (decimal % 10)) precision = 1; // 1 trailing zero, keep 1 decimal place

  // convert value to string
  std::stringstream str;
  str << std::fixed << std::setprecision(precision) << value;
  return str.str();
}