如何强制 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 将整数保留在科学记数法之外的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何将int类型转换成字符串

js取整,保留小数位数、四舍五入、科学记数法及去掉数字末尾多余的0

在pandas python中将指数或科学数转换为整数

excel保留整数17位,

python中要使一个浮点变为整数需要啥函数强制代换?

如何在python大数计算中抑制科学计数法