将科学计数法转换为浮点数

54

遇到了一个问题,我的JSON数据以科学计数法而不是浮点数形式打印。

import urllib2
import json
import sys

url = 'https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-quid'
json_obj = urllib2.urlopen(url)
QUID_data = json.load(json_obj)

QUID_MarketName_Trex = QUID_data["result"][0]["MarketName"][4:9]
QUID_Last_Trex = QUID_data["result"][0]["Last"]
QUID_High_Trex = QUID_data["result"][0]["High"]
QUID_Low_Trex = QUID_data["result"][0]["Low"]
QUID_Volume_Trex = QUID_data["result"][0]["Volume"]
QUID_BaseVolume_Trex = QUID_data["result"][0]["BaseVolume"]
QUID_TimeStamp_Trex = QUID_data["result"][0]["TimeStamp"]
QUID_Bid_Trex = QUID_data["result"][0]["Bid"]
QUID_Ask_Trex = QUID_data["result"][0]["Ask"]
QUID_OpenBuyOrders_Trex = QUID_data["result"][0]["OpenBuyOrders"]
QUID_OpenSellOrders_Trex = QUID_data["result"][0]["OpenSellOrders"]
QUID_PrevDay_Trex = QUID_data["result"][0]["PrevDay"]
QUID_Created_Trex = QUID_data["result"][0]["Created"]
QUID_Change_Trex = ((QUID_Last_Trex - QUID_PrevDay_Trex)/ QUID_PrevDay_Trex)*100
QUID_Change_Var = str(QUID_Change_Trex)
QUID_Change_Final = QUID_Change_Var[0:5] + '%'

print QUID_Last_Trex   
它打印以下值:1.357e-05。 我需要它成为一个浮点数,小数点后有8个字符(0.00001370)
正如您在此处所见 --> http://i.imgur.com/FCVM1UN.jpg,我的GUI显示第一行正确(使用完全相同的代码)。
3个回答

85

您正在查看浮点数的默认str()格式,对于足够小或大的数字,使用科学计数法。

您不需要进行转换,数值本身就是一个适当的浮点数。如果您需要以不同的格式显示它,请显式地格式化

>>> print(0.00001357)
1.357e-05
>>> print(format(0.00001357, 'f'))
0.000014
>>> print(format(0.00001357, '.8f'))
0.00001357

在这里,f 格式始终对值使用定点表示法。默认精度为6位数字;.8 指示 f 格式化程序显示 8 位数字。

在 Python 3 中,默认的字符串格式与 format(fpvalue, '.16g') 实质上相同;g 格式根据数字的指数使用科学计数法或定点表示法。Python 2 使用了 '.12g'


7
你可以使用打印格式化功能:
x = 1.357e-05    
print('%f' % x)

编辑:

print('%.08f' % x)

链接到JSON--> https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-quid ## 对象LAST当前读取为'0.00001361'。使用您的解决方案,它会打印出'0.000014'。由于某种原因它被四舍五入了。 - Loops
是的,它被舍入到小数点后6位。正如Martijn Pieters所写,您可以指定它。 >>> print('%.08f' % x) - Evgeny Prokurat
顺便问一下,为什么您期望的是0.00001370而不是0.00001357,对于1.357e-05? - Evgeny Prokurat
谢谢!这是一种加密货币的汇率,最后两位小数会有很大的差别,所以我需要显示全部8位小数。现在它起作用了。非常感谢您。 - Loops

4

有几种方法:


#1 float(...) + 可选的 round().format()

x = float(1.357e-05)
round(x, 6)
"{:.8f}".format(x)

#2 使用 decimal

import decimal

tmp = decimal.Decimal('1.357e-05')
print('[0]', tmp)
# [0] 0.00001357

tmp = decimal.Decimal(1.357e-05)
print('[1]', tmp)
# [1] 0.0000135700000000000005188384444299032338676624931395053863525390625

decimal.getcontext().prec = 6
tmp = decimal.getcontext().create_decimal(1.357e-05)
print('[2]', tmp)
# [2] 0.0000135700

#3 with .rstrip(...)

x = ("%.17f" % n).rstrip('0').rstrip('.')

注意:有与%f对应的变量:
%f用于显示标准记数法
%e用于显示科学记数法
%g用于显示默认格式(如果有5个或更多的零则使用科学记数法)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接