C++:使用大数 (>1 mrd.) 和分度进行计算

C++: Calculate using large numbers (>1 mrd.) and procentage

本文关键字:mrd 计算 gt C++      更新时间:2023-10-16

我想使用当前值的百分比来计算元素的价格。例如:一个苹果现在的价格为4 $,对于您购买的每个苹果,价格都会上涨7%。因此,第一个苹果将花费4美元,接下来的4.28 $(价格 4 $的7%),下一个4.58 $(价格 4.28 $的7%)等等。我的脚本以某种方式工作,但是随着数字越来越大,我很难为此找到正确的数据类型。由于我必须到最后2位数字,所以我正在做这样的事情:

int64_t c = 0;
double ergebnis = 0;
double komma1 = 0;
komma1 = komma1 + ((komma1 / 100) * 7);
c = komma1 * 100;
ergebnis = c / 100.0;

问题是,如果我购买了50000个苹果,这个数字将会太大,以至于结果将成为负数。我正在使用" Visual Studio 2017社区版"。

#include "stdafx.h"
#include "stdint.h"
#include "iostream"
#include "Windows.h"
using namespace std;
int main()
{
    cout.precision(40);
    int price = 4;
    long double cost = 0;
    long double b = 4;
    int d = 0;
    while (d != 50000)
    {
        cost = price + (price / 100 * 7);
        price = cost * 100.00;
        cost = price / 100.00;
        d = d++;
    }
    cout << "Number is: " << cost << endl;
    Sleep(5000);
    return 0;
}

这几乎描述了我的问题。

我已经使用了Google并找到了将" INT64_T"用作整数的想法,但是我认为真正的问题是这里的双重问题,对吗?

so,tl; dr:

  • 在C ?
  • 中使用相当大数字的任何方法
  • 有什么方法可以使用其他解决方案解决我的问题?喜欢将数字分配或其他东西?喜欢:

    if(number == 1.000.000){百万=百万 ;数字= 4;}

在您的编辑代码中:

首先,此:

d = d++;

可能是未定义的(您应该收到汇编警告),例如:

warning: operation on 'd' may be undefined [-Wsequence-point]
         d = d++;
         ~~^~~~~

用:

替换此代码行
d++;

等效于:

d = d + 1;

priceint。然后,您执行整数price / 100,这将给出int的结果!因此,整数部门的4/100给出0。将一个操作数施加到浮点值,以获取将产生浮点数数字的划分。例如。(long double)price / 100

但是,您所说的算法与预期结果不符。您说您想从4美元,4.28美元收取费用,然后收取4.58美元。实现此目的的公式不是您描述的,而是:

cost = cost + cost * 7%

此外,这两行代码没有意义:

price = cost * 100.00;
cost = price / 100.00;

只是丢弃它们。

此外,由于您知道要执行迭代的次数多少次,请使用循环,而不是wires循环。

将所有东西放在一起,您得到:

 #include "iostream"
using namespace std;
int main()
{
    cout.precision(40);
    long double cost = 4;
    for(int i = 0; i < 50000; ++i)
    {
        cost = cost + ((long double)cost / 100 * 7);
    }
    cout << "Cost is: " << cost << endl;
    return 0;
}

您试图计算复合兴趣的尝试是非常错误的。该程序没有做任何与您的描述所说的事情相似的事情。

这是您的循环的外观:

 long double price = 4.0;
 for (int i = 0; i < 50000; ++i)
 {
    price = price * 1.07; // == (100.0 + 7.0)/100.0
 }

常规double没有代表您价格的范围,但是long double还可以。如果您想走更大,则需要第三方大数库。请注意,离答案的最接近整数具有约1500个十进制位数,因此具有这样的数字的计算可能会很慢。

可以在不循环的情况下获得相同的结果:

  std::cout "The number is " << 4 * std::pow (1.07L, 50000) << "n";

尝试long double而不是double。在C和C 中长双重和双重之间的差异。

提防浮点精度,并在使用对精度敏感的变量进行计算时进行转换。

在C ?

中使用相当大的方法

使用库,例如GNU多重精度(GMP):

"用于任意精确算术的免费库,在签名的整数上运行,有理数和浮点数。精确度没有实际限制,除了机器GMP中可用内存所隐含的数字外,GMP启用了。GMP具有丰富的功能集,并且功能具有常规接口。"

但是,这些库用于高级用法。确保您确实需要使用大量数(处理时大量耗时)。