【问题标题】:Getting wrong results after simple multiplication - C++简单乘法后得到错误结果 - C++
【发布时间】:2018-04-15 03:26:54
【问题描述】:

所以,需要做的是:输入一个实数,打印小数点后前4位的和。例如:我输入 5.1010。我到了需要将 0.1010 乘以 10000 才能变成整数的地步,但我得到的结果是 1009 而不是 1010,之后一切都崩溃了。 如果有人能向我解释为什么会发生这种情况,我将永远感激不尽。

#include<iostream>
using namespace std;

int main()
{
  double n;
  cout<<"Enter a positive real number: ";
  do
  {
    cin>>n;
    if(n<=0) cout<<"The number must be positive, enter again: ";
  }while(n<=0);

    //storing the fractional part in a var
  int y=n;
  double fr=n-y;
  //turning the fractional part into an integer
  int fr_int=fr*10000;
  cout<<fr_int<<endl;

  //storing each of the digits in a var
  int a=fr_int/1000;
  int b=fr_int/100%10;
  int c=fr_int/10%10;
  int d=fr_int%10;

  cout<<"The sum of the first 4 digits is: " << a+b+c+d;
  return 0;
}

【问题讨论】:

标签: c++


【解决方案1】:

您可以简单地更改代码如下,然后它应该可以工作。

  n *= 10000;
  int Integer = n;

  int i = 4;
  int sum = 0;
  while(i--)
  {
    sum += (Integer%10);
    Integer /= 10;
  }
  std::cout << "The sum of the first 4 digits is: " << sum;

这是输出:https://www.ideone.com/PevZgn

更新:一般化的解决方案将使用std::string。但是,如果代码能够在用户提交非数字的情况下处理异常,那就太好了。

#include <iostream>
#include <string>

int main()
{
  std::string Number;
  double tempNum = 0.0;

  std::cout << "Enter a positive real number: ";
  do
  {
    std::cin >> Number;
    tempNum = std::stof(Number);

    if(tempNum <= 0)
      std::cout << "The number must be positive, enter again: ";
  }while(tempNum <= 0);

  bool Okay = false;
  int sum = 0;
  int i = 4;

  for(const auto& it: Number)
  {
    if(Okay && i > 0)
    {
      sum += static_cast<int>(it - '0');
      --i;
    }
    if(it == '.') Okay = true;
  }
  std::cout << "The sum of the first 4 digits is: " << sum;

  return 0;
}

【讨论】:

    【解决方案2】:

    我认为你应该在转换之前添加 0.5,因为编译总是会截断数字。

    在 C++11 中,您可以使用 std::round。

    【讨论】:

    • 我做了,但我的声望低于 15,所以没有显示
    【解决方案3】:

    C++ 中的浮点数和双精度数无法准确表示所有十进制数。特别是0.1,它不能忠实地表示。

    如果您必须保证获得准确的结果,您应该使用定点数学或大数库。

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2018-01-27
      • 2023-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多