首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >四舍五入小数的问题(python)

四舍五入小数的问题(python)
EN

Stack Overflow用户
提问于 2012-01-15 02:25:43
回答 5查看 22.9K关注 0票数 24

在我的程序中,十进制精度是非常重要的。

我的许多计算必须精确到小数点(例如50位)。

因为我使用的是python,所以我一直在使用十进制模块(带有context().prec = 99 )。当实例化一个十进制对象时,设置为有99小数位的精度)

因为丙酮浮子不允许任何接近这样的精确度。

由于我希望用户指定精确计算的小数位,所以我不得不在代码中实现几个循环()函数。

不幸的是,内置的圆函数和十进制对象并不能很好地相互作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
round(decimal.Decimal('2.000000000000000000001'),50)

# Number is 1e-21.   There are 21 decimal places, much less than 50.

然而,结果是2.0而不是

圆函数不舍入到50。更别说了!

是的,我已经确保过四舍五入不是在实例化Decimal对象时发生的,而是在调用循环之后发生的。

我总是将表示浮点的字符串传递给Decimal构造函数,而不是pythonic浮点数。

为什么圆函数要这样对我?

(我意识到它可能最初是为pythonic浮标设计的,它永远不会有如此多的小数位,但是文档声称十进制对象完美地集成到python代码中,并且与内置的python函数兼容!)

非常感谢!

(这让我相当不安,因为这个问题破坏了整个程序的使用)

规格:

python 2.7.1

Windows 7

十进制模块(内置)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-15 02:55:56

据我所知,问题是round()返回的是Python float类型,而不是Decimal类型。因此,在decimal模块上设置多高的精度并不重要,因为一旦调用round(),就不再有Decimal

要解决这个问题,您可能需要想出一种不依赖round()的替代方法来绕过您的数字。比如雷蒙德的建议。

你可能会发现这个简短的想法--一个例子说明:http://ideone.com/xgPL9

票数 8
EN

Stack Overflow用户

发布于 2012-01-15 02:33:45

由于http://docs.python.org/library/functions.html#round强制它的输入到一个常规二进制浮点数,所以循环十进制对象的首选方法是使用http://docs.python.org/library/decimal.html#decimal.Decimal.quantize方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> from decimal import Decimal
>>> d = Decimal('2.000000000000000000001')

>>> d.quantize(Decimal(10) ** -20)     # Round to twenty decimal places
Decimal('2.00000000000000000000')

若要砍掉尾随零点,请将http://docs.python.org/library/decimal.html#decimal.Decimal.normalize应用于舍入结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> d = Decimal('2.000000000000000000001')
>>> d.quantize(Decimal(10) ** -20).normalize()
Decimal('2')
票数 45
EN

Stack Overflow用户

发布于 2013-02-27 10:54:36

试试下面的..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from decimal import Decimal, ROUND_HALF_UP, getcontext

getcontext().prec = 51

def round_as_decimal(num, decimal_places=2):
    """Round a number to a given precision and return as a Decimal

    Arguments:
    :param num: number
    :type num: int, float, decimal, or str
    :returns: Rounded Decimal
    :rtype: decimal.Decimal
    """
    precision = '1.{places}'.format(places='0' * decimal_places)
    return Decimal(str(num)).quantize(Decimal(precision), rounding=ROUND_HALF_UP)

round_as_decimal('2.000000000000000000001', decimal_places=50)

希望这能帮上忙!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8868985

复制
相关文章
format python保留小数点后几位_python四舍五入保留两位小数
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169805.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
1.2K0
format python保留小数点后几位_python四舍五入保留两位小数
java 四舍五入保留小数的几种方式
(new BigDecimal()).setScale()方法用于格式化小数点,有多种小数保留模式,如下:
全栈程序员站长
2022/08/31
2.4K0
【Java】Java四舍五入保留1位小数、2位小数…
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143140.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/25
2.8K0
java四舍五入保留小数「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139172.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
3780
java float四舍五入保留两位小数,java四舍五入float保留两位小数
摘要 腾兴网为您分享:java四舍五入float保留两位小数,远离手机,相机美颜,未来屋,微视等软件知识,以及流光,证券从业随身学,老a工具箱,polarr,特斯拉app,ae插件合集,福奈特,app名称,哈士奇表情,电视台直播源,思兔,门海,电子台账软件,3c电池,smartflashrecovery等软件it资讯,欢迎关注腾兴网。四舍五入我们大家都知道是什么但在java中四舍五入函数是什么如何实现float保留指定位数?具体我们来看小编整理的一些例子。 例子1 float f = 34.237323f; BigDecimal b = new BigDecimal(f); float f…
全栈程序员站长
2022/08/31
8330
MySQL对小数进行四舍五入等操作
FLOOR(X) 返回不大于X的最大整数。 CEIL(X)、CEILING(X) 返回不小于X的最小整数。
翎野君
2023/08/25
5480
java四舍五入(保留两位小数)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145899.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/29
5950
java四舍五入取整算法(小数四舍五入取整公式)
static double ceil(double a):天花板函数,返回大于等于a的最小整数(但是以浮点数形式存储)。
全栈程序员站长
2022/07/31
2.2K0
java四舍五入取整算法(小数四舍五入取整公式)
Java四舍五入保留两位小数
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143295.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.1K1
sql 四舍五入 保留两位小数
数据库里的 float momey 类型,都会精确到多位小数。但有时候 我们不需要那么精确,例如,只精确到两位有效数字。
全栈程序员站长
2022/09/06
5.3K0
js保留两位小数四舍五入_parsefloat保留两位小数
如果大家想对javascript有系统深入的学习,可以参阅 JavaScript启示录 PDF原书完整版 这本经典书籍
全栈程序员站长
2022/09/23
5.1K0
bigdecimal保留最多小数位_bigdecimal四舍五入保留两位小数
参考:https://www.cnblogs.com/jpfss/p/8072379.html
全栈程序员站长
2022/11/09
9030
Python3 四舍五入问题详解
“就本质来说,浮点算术是不精确的,而且程序员们很容易滥用它,从而使计算的结果几乎全部由噪声组成”
用户9077582
2021/10/11
3.5K0
Java四舍五入保留小数点后几位
银行家算法: 四舍:舍弃的数值:0.000、0.001、0.002、0.003、0.004,因为是舍弃的,对银行家来说,就不用付款给储户了,那每舍弃一个数字就会赚取相应的金额:0.000、0.001、0.002、0.003、0.004。 五入:进位的数值:0.005、0.006、0.007、0.008、0.009,因为是进位,对银行家来说,每进一位就会多付款给储户,也就是亏损了,那亏损部分就是其对应的10进制补数:0.005、0.004、0.003、0.002、0.001。 因为舍弃和进位的数字是在0到9之间均匀分布的,所以对于银行家来说,每10笔存款的利息因采用四舍五入而获得的盈利是:
全栈程序员站长
2022/08/31
1.4K0
Java四舍五入保留小数点后几位
php 保留两位小数,不四舍五入
高久峰
2023/06/03
1.7K0
java保留两位小数不四舍五入_java截取两位小数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
1.3K0
JAVA保留两位小数(四舍五入)「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.7K0
JAVA保留两位小数(四舍五入)「建议收藏」
Java之float取2位小数,末位四舍五入
JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数. 以前以为很容易,一直没在意,今天突然用到了,才发现,系统没有这样的函数.狂晕,同事们用的方法为,先转成String,再取其中几位,再转成float型,(如:String.valueOf(c).substring(0,String.valueOf(c).indexOf(".") + 3)):
IT工作者
2022/03/30
2K0
恶心的0.5四舍五入问题
四舍五入是财务类应用中常见的需求,按中国人的财务习惯,遇到0.5统一向上进位,但是c#与java中默认的却不是这样。 见c#代码: 1 static void Main(string[] args) 2 { 3 Decimal d = 301353.05M; 4 Console.WriteLine(d);//301353.05 5 Console.WriteLine(Math.Round(d, 1));/
菩提树下的杨过
2018/01/19
1.3K0
Python保留小数的方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169776.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/21
2.6K0

相似问题

python小数四舍五入问题

114

Python大小数四舍五入问题

19

小数四舍五入的问题

12

MySQL小数四舍五入问题

20

KendoNumericTextBox小数四舍五入问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文