C++ 有没有一种方法可以将一个数字作为字符串,在不使用float或double的情况下,将其四舍五入到精确的位数?

C++ 有没有一种方法可以将一个数字作为字符串,在不使用float或double的情况下,将其四舍五入到精确的位数?,c++,C++,我有一个非常大的十进制数作为字符串,它不能用浮点或双精度来精确表示,因此我不能使用任何与数字相关的函数,我必须将我的数字保持为字符串,并使用字符串执行所有函数 例如:PI: string pI = round("3.141592653589793239", 6); 将返回“3.141593” 精度通常指的是总位数,因此我的答案的精度为7,所以我将称之为小数点,以免混淆这个问题 我意识到我可以写一个函数来做这件事,我正在做这件事,但我想问做这件事的最准确的方法,到目前为止这不是我的代码,我把它归

我有一个非常大的十进制数作为字符串,它不能用浮点或双精度来精确表示,因此我不能使用任何与数字相关的函数,我必须将我的数字保持为字符串,并使用字符串执行所有函数

例如:PI:

string pI = round("3.141592653589793239", 6);
将返回
“3.141593”

精度通常指的是总位数,因此我的答案的精度为7,所以我将称之为小数点,以免混淆这个问题

我意识到我可以写一个函数来做这件事,我正在做这件事,但我想问做这件事的最准确的方法,到目前为止这不是我的代码,我把它归咎于我的头痛,但我花了太多时间寻找解决方案,忙于使用这个库和那个库,似乎应该有一个库可以做到这一点,而不使用浮点数学,我研究了一些任意精度的算术库,但没有弄清楚如何设置小数位数,并且尝试使用精度,结果停滞不前,因为它给我的数字在小数点后0-42位之间的下限是不正确的

我在QT-QML FelGo应用程序中使用这个,所以我将通过QC++ JavaScript调用它,通过C++后端调用。 更新: 编写我的字符串循环函数非常快,需要检查的东西太多,在开始测试之前,它可能听起来很简单

看着

CLN:

MPIR:

GMP的一个分支:

TTMath BigNum:

我对Boost有一个问题,最后是一个bug报告, 我想我可以写我自己的圆函数, 所以我可以用他们的图书馆,但重点是什么, 无论我使用什么样的库,我都对准确性有要求, 和小数点位

有数学需求的人,需要一个能够处理他们所有需求的数学库,四舍五入到一个特定的小数位是给定的,但是我很难在任何库中找到一个能达到这个要求的函数,所以我必须测试每个库,这不容易,首先你必须学会如何使用它,如果它不能按你认为应该的方式工作,你最终会花更多的时间,就像我在这里做的那样,试图弄明白它,相信我,我读了所有关于使用大数字的帖子,特别是浮点数,我可以找到,但没有一个真正涉及任意小数点精度,意思是以特定的小数精度进行数学运算,大多数人认为越精确越好,这不是我的情况,我正在寻找一种方法来进行数学运算,它将返回正确的数字,而不是对它的估计,浮点和长双精度是一种我无法使用的估计,它偏离了100英里,这让我感到不舒服,但不至于仅仅是糟糕的估计,boost给了我正确的数字,我只是不知道如何使用精度来调整位数,这不是真正的boost,因为他们从来没有认为添加一个函数来设置小数点很重要,我认识的人很少关心精度,他们只关心它有多少小数点,具体地说,在不使用精度的情况下返回一组小数位数,我认为如果我取左边的长度,或者整数边的长度,并加上精度,它应该可以工作,我错了,结果也是,所以我真正需要的是一个理解这一点的库

我现在意识到每一个计算器充其量只是一个估计器

我确实找到了一个与数字有关的库,没有尝试过,但要完成的是:

我喜欢libmpdec的概念,所以我现在就开始研究它

我最终使用了 它在Qml中工作得很好,只需将“bignumber.js”作为BigNumberJs导入, 并按照指示进行操作

感谢您的帮助。

如果您需要精确的小数位数,您提到的所有库都超出了范围,或者需要设置荒谬的精度级别,以确保结果精确四舍五入

问题是它们都基于二进制浮点,因此当您指定精度时,例如,在GMP/MPIR中使用
mpf\u set\u default\u prec
(或等效的调用),您要说的是有效位将使用多少位(大致上,在按指数缩放之前存在多少位整数精度)。虽然与十进制精度存在粗略对应关系(因此,对于大多数情况,对于所需精度的每一个十进制数字,使用四位有效位通常就足够了),但缺少十进制精度意味着始终需要显式输出舍入以避免假精度,而且总是存在舍入不一致的风险:逻辑上以
5
结尾的数字,应该遵守舍入规则,如“半舍五入偶数”、“半舍五入向上”或“半舍五入向下”,可能会以错误的精度结尾,使其看起来不完全以
5
结尾,因此舍入规则不适用

您需要的是一个十进制数学库,如Java的
BigDecimal
、Python的
decimal
,等等。它是的核心(在Python3.3+上,这是
decimal
模块的后端,因此您可以在Python上试验它的行为,然后在C/C++项目中使用它)。因为它是基于十进制的,所以可以保证精度水平;如果将精度设置为4,并将模式设置为
四舍五入半偶数
,则解析
“XX.X45”
将始终生成
“XX.X4”
,而
“XX.X75”
将始终生成
“XX.X8”
(最后的
5
将下一个数字四舍五入偶数)。您还可以“量化”到小数点后的特定精度(因此您的精度可能是100,以允许在d的左侧和右侧组合100个数字)