如何强制 Python 将整数保留在科学记数法之外
Posted
技术标签:
【中文标题】如何强制 Python 将整数保留在科学记数法之外【英文标题】:How do I force Python to keep an integer out of scientific notation 【发布时间】:2012-09-28 00:00:09 【问题描述】:我正在尝试在 Python 3.2 中编写一个加密短语然后解密它的方法。问题是这些数字是如此之大,以至于当 Python 对它们进行数学运算时,它会立即将其转换为科学记数法。因为我的代码需要所有的数字才能使用科学计数法,所以这没什么用。
我拥有的是:
coded = ((eval(input(':'))+1213633288469888484)/2)+1042
基本上,我只是从用户那里得到一个数字并对其进行一些数学运算。
我尝试了format()
和其他一些方法,但我无法让它们工作。
编辑:我只使用偶数。
【问题讨论】:
一个小评论:Python 从不以科学计数法显示整数。你的问题是你没有int,你有一个float。所以,这个问题并不完全准确。但很清楚你在问什么,mgilson 的回答说明了一切。 【参考方案1】:在 python3 中,'/'
进行真正的除法(例如浮点)。要获得整数除法,您需要使用//
。换句话说,100/2
产生 50.0
(浮点数)而 100//2
产生 50
(整数)
您的代码可能需要更改为:
coded = ((eval(input(':'))+1213633288469888484)//2)+1042
不过,作为一个警示故事,您可能需要考虑使用 int
而不是 eval
:
coded = ((int(input(':'))+1213633288469888484)//2)+1042
【讨论】:
至少有三个不同的博客叫做“Eval is Evil”或“Why Eval is Evil”,所有这些都可能值得一读。但简而言之:它使调试变得更加困难,它使您的代码容易受到恶意用户的攻击,而且效率较低。 考虑eval("os.system('rm -rf *')")
@DanG -- 添加到 wim 的回复中,eval("__import__('os').system('rm -rf *')
。 (换句话说,你甚至不需要导入 os
就容易受到攻击。
mgilson 和 @wim 我对这种僵硬的东西有点陌生,所以你真的让我很困惑
@DanG。 -- 基本上,如果用户在您的程序中键入该命令,它将删除您的程序正在运行的目录中的所有内容。【参考方案2】:
如果您知道浮点值确实是一个整数,或者您不关心删除小数部分,您可以在打印之前将其转换为int
。
>>> print 1.2e16
1.2e+16
>>> print int(1.2e16)
12000000000000000
【讨论】:
真的吗?所以print int(1.2e24)
会显示1200000000000000000000000
?不。答案是首先避免将 int 转换为 float;一旦你这样做了,你就永久丢失了信息,并且没有办法找回它。
@abarnert,当然这是最好的答案。我为标题中提出的问题提供了替代答案,而不是 OP 提出的具体情况。
@MarkRansom 是的,这可以让我打印一个浮点数,但正如 abarnert 所说,丢失的数据太多,无法使用
@DanG。问题和答案将永远留在网站上。我提供这个答案并不是为了您的利益,而是为了将来遇到与标题更相似的问题的 Google 员工的利益。
@MarkRansom 对于题为“如何将 Python 中的数字从科学记数法转换”的帖子,我建议使用这个答案。而不是“首先如何避免科学记数法中的数字”以上是关于如何强制 Python 将整数保留在科学记数法之外的主要内容,如果未能解决你的问题,请参考以下文章