C++ C++;:使用大数值(>;1 mrd.)和过程进行计算
我想使用当前值的百分比来计算元素的价格。例如:一个苹果现在的价格是4美元,每买一个苹果,价格就会上涨7%。因此,第一个苹果的售价为4美元,下一个为4.28美元(价格为4美元的7%),下一个为4.58美元(价格为4.28美元的7%),依此类推。 我的脚本在某种程度上起了作用,但随着数字的增加,我很难找到合适的数据类型。 因为我必须四舍五入到最后两位数,所以我会这样做:C++ C++;:使用大数值(>;1 mrd.)和过程进行计算,c++,floating-point,integer,double,precision,C++,Floating Point,Integer,Double,Precision,我想使用当前值的百分比来计算元素的价格。例如:一个苹果现在的价格是4美元,每买一个苹果,价格就会上涨7%。因此,第一个苹果的售价为4美元,下一个为4.28美元(价格为4美元的7%),下一个为4.58美元(价格为4.28美元的7%),依此类推。 我的脚本在某种程度上起了作用,但随着数字的增加,我很难找到合适的数据类型。 因为我必须四舍五入到最后两位数,所以我会这样做: int64_t c = 0; double ergebnis = 0; double komma1 = 0; komma1 =
int64_t c = 0;
double ergebnis = 0;
double komma1 = 0;
komma1 = komma1 + ((komma1 / 100) * 7);
c = komma1 * 100;
ergebnis = c / 100.0;
warning: operation on 'd' may be undefined [-Wsequence-point]
d = d++;
~~^~~~~
问题是,如果我买了50000个苹果,这个数字会变得非常大,结果会变成一个负数。我正在使用“Visual Studio 2017社区版”
#包括“stdafx.h”
#包括“stdint.h”
#包括“iostream”
#包括“Windows.h”
使用名称空间std;
int main()
{
计算精度(40);
国际价格=4;
长期双重成本=0;
长双b=4;
int d=0;
而(d!=50000)
{
成本=价格+(价格/100*7);
价格=成本*100.00;
成本=价格/100.00;
d=d++;
}
不能尝试long double
而不是double
使用对精度敏感的变量执行计算时,请注意浮点精度和转换
<>在C++中使用任意大数的方法?< /p>
使用一个库,如Gnu Multiple Precision():
用于任意精度算术的免费库,对有符号整数、有理数和浮点数进行操作。除GMP运行的机器中可用内存所暗示的精度外,精度没有实际限制。GMP有一组丰富的函数,函数有一个规则的接口
但是,这些库是供高级使用的。请确保您确实需要使用这些大的数字(处理大的数字非常耗时)。在您编辑的代码中:
首先,这是:
d = d++;
可能未定义(您应该会收到编译警告),如下所示:
int64_t c = 0;
double ergebnis = 0;
double komma1 = 0;
komma1 = komma1 + ((komma1 / 100) * 7);
c = komma1 * 100;
ergebnis = c / 100.0;
warning: operation on 'd' may be undefined [-Wsequence-point]
d = d++;
~~^~~~~
将这一行代码替换为:
d++;
这相当于:
d = d + 1;
price
是一个int
。然后执行整数除法price/100
,结果是int
!因此整数除法中的4/100为0。将一个操作数转换为一个浮点值,以得到一个将产生浮点数的除法。例如(长双精度)价格/100
但是,您所描述的算法与预期结果不符。您说要从4美元到4.28美元再到4.58美元收费。实现这一目标的公式不是您所描述的公式,而是:
cost = cost + cost * 7%
此外,这两行代码毫无意义:
price = cost * 100.00;
cost = price / 100.00;
扔掉它们就行了
此外,由于您知道希望迭代执行多少次,所以请使用for循环,而不是while循环
把所有东西放在一起,你会得到:
#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;
}
#包括“iostream”
使用名称空间std;
int main()
{
计算精度(40);
长期双重成本=4;
对于(int i=0;i<50000;++i)
{
成本=成本+((长双倍)成本/100*7);
}
cout您计算复利的尝试出了可怕的错误。该程序所做的与您描述的完全相同
以下是循环的外观:
long double price = 4.0;
for (int i = 0; i < 50000; ++i)
{
price = price * 1.07; // == (100.0 + 7.0)/100.0
}
尝试使用长双精度
,它具有相当高的精度。此外,您可能希望查看第三方库,如Boost,以获取非常高的数字。“明显的问题是“什么明显的问题?没有看到任何问题。”-19974798308344或类似“没有”或类似的内容在整数集合中。请发布一个。这应该包括一个可构建的可运行程序、它所需的任何输入、所需的输出和实际输出。price=cost*100.00;cost=price/100.00;
这没有意义。这段代码应该做什么?为什么你的price
是一个整数?d=d++
不做你想做的事是的,gsamaras已经指出了这一点。我只是犯了一些非常愚蠢的错误……嗯,cost*100
部分应该对数字进行四舍五入,但我想我可以使用“roundl”,对吗?您好,请不要使用问候语或感谢语。问题希望在你问了一天之后很长时间都有用,而在晚上,所以你不需要祝读者一天过得愉快。谢谢你的回答!看起来长双精度实际上工作得更好,但我仍然得到一个负数。我在上面添加了一个例子,maybe这会把事情弄清楚:-)我注意到了一件事:在另一个论坛上,我读到了一些关于除数为100的文章,然后再将其乘法……但是我不能用“roundl”吗来自math.h?我只是在谷歌上搜索了一下,但我不太明白小数点后的数字是怎么定义的。感谢d++的澄清。我一直想知道这个警告是什么意思。似乎VS只是想告诉我不要再傻了:P找到帖子:好吧,我没有得到你得到的数字,我得到了“inf”.我使用的是你贴在那里的确切代码。但是…为什么?因为你使用的计算机比我的计算机有更小的限制。在wandbox.org上试试,你会看到的!唷,很高兴知道。谢谢你这么多的帮助!我真的很感激。很抱歉问了这么愚蠢的问题。作为一个初学者很差劲…:哦,我的上帝,这让人难堪…嗯,t汉克,这实际上回答了我的问题:D