นี่คือรหัสของฉัน:
x = 1.0
y = 100000.0
print x/y
1.00000e-05
แสดงความฉลาดของฉันเป็น
มีวิธีใดที่จะระงับสัญกรณ์ทางวิทยาศาสตร์และทำให้มันแสดงเป็น
0.00001
? ฉันจะใช้ผลลัพธ์เป็นสตริง
นี่คือรหัสของฉัน:
x = 1.0
y = 100000.0
print x/y
1.00000e-05
แสดงความฉลาดของฉันเป็น
มีวิธีใดที่จะระงับสัญกรณ์ทางวิทยาศาสตร์และทำให้มันแสดงเป็น
0.00001
? ฉันจะใช้ผลลัพธ์เป็นสตริง
คำตอบ:
'%f' % (x/y)
แต่คุณต้องจัดการความแม่นยำด้วยตัวเอง เช่น,
'%f' % (1/10**8)
จะแสดงเลขศูนย์เท่านั้น
รายละเอียดอยู่ในเอกสาร
หรือสำหรับ Python 3 การจัดรูปแบบเก่าที่เทียบเท่าหรือการจัดรูปแบบสไตล์ที่ใหม่กว่า
ใช้รุ่นที่ใหม่กว่า''.format
(โปรดจำไว้ว่าต้องระบุจำนวนหลักหลังจากที่.
คุณต้องการแสดงซึ่งขึ้นอยู่กับจำนวนลอยตัวที่เล็ก) ดูตัวอย่างนี้:
>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'
ตามที่แสดงข้างต้นค่าเริ่มต้นคือ 6 หลัก! นี่ไม่เป็นประโยชน์สำหรับตัวอย่างกรณีของเราดังนั้นเราสามารถใช้สิ่งนี้แทน:
>>> '{:.20f}'.format(a)
'-0.00000000000000007186'
การเริ่มต้นใน Python 3.6 สิ่งนี้สามารถทำให้ง่ายขึ้นด้วยสตริงตัวอักษรที่จัดรูปแบบใหม่ดังนี้:
>>> f'{a:.20f}'
'-0.00000000000000007186'
f"{a:.{precision}f}"
ด้วย Python เวอร์ชันใหม่กว่า (2.6 และใหม่กว่า) คุณสามารถใช้''.format()
เพื่อบรรลุสิ่งที่ @SilentGhost แนะนำ:
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
อีกทางเลือกหนึ่งถ้าคุณใช้แพนด้าและต้องการที่จะระงับสัญกรณ์วิทยาศาสตร์สำหรับลอยทั้งหมดคือการปรับตัวเลือกแพนด้า
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
คำตอบส่วนใหญ่ข้างต้นต้องการให้คุณระบุความแม่นยำ แต่ถ้าคุณต้องการแสดงโฟลตแบบนี้โดยไม่มีศูนย์ที่ไม่จำเป็น:
1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001
numpy
มีคำตอบ: np.format_float_positional
import numpy as np
def format_float(num):
return np.format_float_positional(num, trim='-')
สิ่งนี้จะใช้ได้กับเลขชี้กำลังใด ๆ :
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
นี่คือการใช้คำตอบของกัปตันแตงกวาแต่มี 2 เพิ่มเติม
1) การอนุญาตให้ฟังก์ชันรับตัวเลขที่ไม่ใช่เชิงวิทยาศาสตร์และเพียงส่งคืนตามที่เป็นอยู่ (เพื่อให้คุณสามารถป้อนอินพุตจำนวนมากได้ว่าตัวเลขบางส่วนคือ 0.00003123 เทียบกับ 3.123e-05 และยังมีฟังก์ชั่นการใช้งาน
2) เพิ่มการสนับสนุนสำหรับจำนวนลบ (ในฟังก์ชั่นดั้งเดิมจำนวนลบจะสิ้นสุดเช่น 0.0000-108904 จาก -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
นอกเหนือจากคำตอบของ SG คุณยังสามารถใช้โมดูลทศนิยม:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
หากเป็นเช่นstring
นั้นให้ใช้บิวด์อินfloat
เพื่อทำการแปลงตัวอย่างเช่น:
print( "%.5f" % float("1.43572e-03"))
answer:0.00143572
เนื่องจากนี่เป็นผลลัพธ์อันดับต้น ๆ ของ Google ฉันจะโพสต์ที่นี่หลังจากไม่สามารถหาวิธีแก้ไขปัญหาของฉันได้ หากคุณกำลังมองหาการจัดรูปแบบค่าการแสดงผลของวัตถุลอยและยังคงลอยอยู่ - ไม่ใช่สตริงคุณสามารถใช้วิธีนี้:
สร้างคลาสใหม่ที่ปรับเปลี่ยนวิธีการแสดงค่าลอย
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
คุณสามารถแก้ไขความแม่นยำได้ด้วยการเปลี่ยนค่าจำนวนเต็ม {:f}
ใช้ 3.6.4 ฉันมีปัญหาคล้ายกันที่สุ่มตัวเลขในไฟล์ผลลัพธ์จะถูกจัดรูปแบบด้วยสัญกรณ์ทางวิทยาศาสตร์เมื่อใช้สิ่งนี้:
fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))
สิ่งที่ฉันต้องทำเพื่อแก้ไขคือการเพิ่ม 'f':
fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
ตั้งแต่ 3.6 (อาจใช้ได้กับ 3.x ที่เก่ากว่าเล็กน้อยเช่นกัน) นี่เป็นวิธีแก้ปัญหาของฉัน
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')
วัตถุประสงค์ของการ precision
คำนวณคือเพื่อให้แน่ใจว่าเรามีความแม่นยำเพียงพอที่จะป้องกันไม่ให้สัญกรณ์ทางวิทยาศาสตร์ (ความแม่นยำเริ่มต้นยังคงเป็น 6)
dec_precision
อาร์กิวเมนต์เพิ่มความแม่นยำเพิ่มเติมเพื่อใช้สำหรับจุดทศนิยม เนื่องจากสิ่งนี้ใช้ประโยชน์จากn
รูปแบบจึงไม่มีการเพิ่มศูนย์ที่ไม่มีนัยสำคัญ (ต่างจากf
รูปแบบ)n
ยังจะดูแลการแสดงจำนวนเต็มรอบแล้วโดยไม่ต้องทศนิยม
n
ไม่จำเป็นต้องมีการfloat
ป้อนข้อมูลจึงโยน