Đây là mã của tôi:
x = 1.0
y = 100000.0
print x/y
Thương của tôi hiển thị như 1.00000e-05
.
Có cách nào để ngăn chặn ký hiệu khoa học và làm cho nó hiển thị như
0.00001
? Tôi sẽ sử dụng kết quả như một chuỗi.
Đây là mã của tôi:
x = 1.0
y = 100000.0
print x/y
Thương của tôi hiển thị như 1.00000e-05
.
Có cách nào để ngăn chặn ký hiệu khoa học và làm cho nó hiển thị như
0.00001
? Tôi sẽ sử dụng kết quả như một chuỗi.
Câu trả lời:
'%f' % (x/y)
nhưng bạn cần phải tự quản lý chính xác. ví dụ,
'%f' % (1/10**8)
sẽ chỉ hiển thị số không.
chi tiết có trong tài liệu
Hoặc đối với Python 3 định dạng cũ tương đương hoặc định dạng kiểu mới hơn
Sử dụng phiên bản mới hơn ''.format
(cũng nhớ xác định có bao nhiêu chữ số sau khi .
bạn muốn hiển thị, điều này phụ thuộc vào số lượng nhỏ là số nổi). Xem ví dụ này:
>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'
như hình trên, mặc định là 6 chữ số! Điều này không hữu ích cho ví dụ trường hợp của chúng tôi, vì vậy thay vào đó chúng tôi có thể sử dụng một cái gì đó như thế này:
>>> '{:.20f}'.format(a)
'-0.00000000000000007186'
Bắt đầu trong Python 3.6, điều này có thể được đơn giản hóa với chuỗi ký tự được định dạng mới , như sau:
>>> f'{a:.20f}'
'-0.00000000000000007186'
f"{a:.{precision}f}"
Với các phiên bản mới hơn của Python (2.6 trở lên), bạn có thể sử dụng ''.format()
để thực hiện những gì @SilentGhost đã đề xuất:
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
Một tùy chọn khác, nếu bạn đang sử dụng gấu trúc và muốn loại bỏ ký hiệu khoa học cho tất cả các phao, là điều chỉnh các tùy chọn gấu trúc.
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Hầu hết các câu trả lời ở trên yêu cầu bạn chỉ định độ chính xác. Nhưng nếu bạn muốn hiển thị số float như thế này, không có số không cần thiết:
1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001
numpy
có một câu trả lời: np.format_float_positional
import numpy as np
def format_float(num):
return np.format_float_positional(num, trim='-')
Điều này sẽ làm việc cho bất kỳ số mũ:
def getExpandedScientificNotation(flt):
str_vals = str(flt).split('e')
coef = float(str_vals[0])
exp = int(str_vals[1])
return_val = ''
if int(exp) > 0:
return_val += str(coef).replace('.', '')
return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
elif int(exp) < 0:
return_val += '0.'
return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
return_val += str(coef).replace('.', '')
return return_val
Điều này đang sử dụng câu trả lời của Captain Cucumber , nhưng với 2 bổ sung.
1) cho phép hàm lấy các số ký hiệu không khoa học và chỉ cần trả về chúng (vì vậy bạn có thể ném rất nhiều đầu vào mà một số số là 0,00003123 so với 3.123e-05 và vẫn có chức năng hoạt động.
2) thêm hỗ trợ cho số âm. (trong chức năng ban đầu, một số âm sẽ kết thúc như 0,0000-108904 từ -1,08904e-05)
def getExpandedScientificNotation(flt):
was_neg = False
if not ("e" in flt):
return flt
if flt.startswith('-'):
flt = flt[1:]
was_neg = True
str_vals = str(flt).split('e')
coef = float(str_vals[0])
exp = int(str_vals[1])
return_val = ''
if int(exp) > 0:
return_val += str(coef).replace('.', '')
return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
elif int(exp) < 0:
return_val += '0.'
return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
return_val += str(coef).replace('.', '')
if was_neg:
return_val='-'+return_val
return return_val
Ngoài câu trả lời của SG, bạn cũng có thể sử dụng mô-đun thập phân:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
Vì đây là kết quả hàng đầu trên Google, tôi sẽ đăng ở đây sau khi không tìm được giải pháp cho vấn đề của mình. Nếu bạn đang tìm cách định dạng giá trị hiển thị của một đối tượng float và nó vẫn là một float - không phải là một chuỗi, bạn có thể sử dụng giải pháp này:
Tạo một lớp mới sửa đổi cách hiển thị các giá trị float.
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
Bạn có thể tự sửa đổi độ chính xác bằng cách thay đổi các giá trị nguyên trong {:f}
Sử dụng 3.6.4, tôi đã gặp một vấn đề tương tự ngẫu nhiên, một số trong tệp đầu ra sẽ được định dạng bằng ký hiệu khoa học khi sử dụng:
fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))
Tất cả những gì tôi phải làm để khắc phục nó là thêm 'f':
fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
Kể từ 3.6 (có lẽ cũng hoạt động với 3.x cũ hơn một chút), đây là giải pháp của tôi:
import locale
locale.setlocale(locale.LC_ALL, '')
def number_format(n, dec_precision=4):
precision = len(str(round(n))) + dec_precision
return format(float(n), f'.{precision}n')
Mục đích của precision
tính toán là để đảm bảo chúng tôi có đủ độ chính xác để tránh các ký hiệu khoa học (độ chính xác mặc định vẫn là 6).
Đối dec_precision
số thêm độ chính xác bổ sung để sử dụng cho các dấu thập phân. Vì điều này sử dụng n
định dạng, sẽ không có số không đáng kể nào được thêm vào (không giống như f
các định dạng). n
cũng sẽ chăm sóc kết xuất các số nguyên đã làm tròn mà không có số thập phân.
n
không yêu cầu float
đầu vào, do đó, diễn viên.