【问题标题】:Get percent of number in c++在c ++中获取数字的百分比
【发布时间】:2013-07-01 13:38:54
【问题描述】:

如何计算 int 的百分之几?
例如我想从数字中获得 30%,如果我使用这个代码示例,我会得到错误的答案:

int number = 250;
int result = (number / 100) * 30;  

结果将是60,而真正的答案是75,有什么方法可以计算吗?

【问题讨论】:

  • 您正在进行整数除法 250/100 = 2.5 但作为整数它是 2... 最简单的修复方法是通过将 100 设为浮点值来使其成为浮点除法100.0 代替。 "int 结果 = (number / 100.0) * 30;"

标签: c++ integer-division


【解决方案1】:

除之前乘:

int result = number * 30 / 100;

你得到你得到的结果的原因是整数类型的除法产生一个整数结果:250 / 100 是 2。如果你在除法之前乘以你仍然得到一个整数结果,但至少你没有丢失数据中间步骤。但是,如果您必须处理非常大的数字,则存在超出int 允许的范围的危险。

或者,您可以使用浮点运算,其中除法可以产生整数的分数:

int result = number * 0.30;

这可能会产生unexpected results,所以你最好只使用上面的整数。或者写3.0/10而不是0.30

【讨论】:

  • 整数转换是多余的,因为结果将被隐式转换。
  • 谢谢,已删除显式演员表。我认为编译器至少会警告精度损失......
  • 大多数编译器都会发出有关隐式强制转换的警告。显式转换很有价值,因为它可以让其他开发人员和编译器清楚您的意图。警告的原因是使用隐式强制转换无法知道强制转换是有意的还是错误的。
  • 如果第一次乘法的结果溢出int怎么办?例如,考虑以下代码:int number = 1000000000; int result = number * 30 / 100;. The result` 不会是 300000000 因为溢出。
【解决方案2】:

假设数字很小(ish),你可以把它转过来:

 int result = (number * 30) / 100;

(括号不是必需的,但有助于澄清)。

如果其中任何一个数字是几百万,这将不起作用,但对于小于该数字的数字应该没问题。

【讨论】:

    【解决方案3】:

    切换操作数(如其他人建议的那样)也可以,但万一您不想这样做,还有另一种解决方案:

    int number = 250;
    int result = static_cast<double>(number) / 100 * 30; 
    

    【讨论】:

      【解决方案4】:

      试试这个,

      int number = 250;
      float result = number  * (float)(30/100.0);
      

      【讨论】:

      • 为什么要浮动而不是双倍?
      • 目前给定的数字很小,所以浮点数就足够了……那为什么不呢? ps:float i 比 double 快很多
      • @doctorlove 这里是一个很好的答案stackoverflow.com/questions/3426165/…,以说服您尽可能选择浮动..
      • @CodeCrusader 不过,double 应该是默认值。在大多数领域中,与浮点性能不足相比,由于精度不足而遇到问题的可能性要大得多。
      • 为什么要将30/100.0 转换为浮点数?它不是自己漂浮的吗?
      【解决方案5】:

      另一种可能性,在使用 32 位数字时在 Windows 中很好。

      整数 = 750;

      int 结果;

      结果 = MulDiv(num, 30, 100);

      https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-muldiv

      【讨论】:

        【解决方案6】:

        您需要执行浮点数学运算,否则编译器会将此处的所有算术作为整数进行。

        你可以试试

        int result = (number / 100.0) * 30;
        

        【讨论】:

          【解决方案7】:

          使用浮点数:

          float number = 250;
          float result = (number / 100.0) * 30
          

          另外,只需将带有小数点的 100.0 放在那里就足够了。

          因为如果你按照自己的方式进行操作,整数 250 / 100 等于 20(你只能将 100 放入 200 中两次,而整数不关心其余的 50)并且乘以 30 = 60。

          【讨论】:

            【解决方案8】:

            现在我想了一些解决办法:

            int number = 250;
            int result = number * 100;
            result = (result / 100) * 30;
            result /= 100;
            

            【讨论】:

              【解决方案9】:

              整个程序是这样的:

              double number , result;
              
              cout << "Enter the number:";
              cin >> number;
              
              result = number * 30.0 / 100;
              cout << "Result = " << result << endl;
              

              你会得到你的答案....

              【讨论】:

                【解决方案10】:

                分数/项目*30 例如;

                15%

                int score, items;
                cout<<"input your score"<< score<<endl;
                cin>>score;
                cout<<"input number of items"<<items<<endl;
                cin>>items;
                float total=score/items*15
                cout<<"you got "<<total<<""<<endl;
                

                【讨论】:

                  【解决方案11】:

                  这是一个一阶方程,比看起来简单!

                  float annualGrossSalary;
                  cout << "Please enter your annual salary: ";
                  cin >> annualGrossSalary;
                  float annualNetSalary = (annualGrossSalary - (annualGrossSalary / 100) * 40);
                  float monthyGrossSalary = annualGrossSalary / 12;
                  float monthyNetSalary = annualNetSalary / 12;
                  cout << "Your monthly gross salary is " << monthyGrossSalary << "\n";
                  cout << "Your monthly net salary is " << monthyNetSalary << "\n";
                  cout << "In 10 years you will earn " << annualNetSalary * 10 << "\n";
                  

                  【讨论】:

                    猜你喜欢
                    • 2021-11-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-10-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多