วิธีการระงับสัญลักษณ์ทางวิทยาศาสตร์เมื่อพิมพ์ค่าทศนิยม?


147

นี่คือรหัสของฉัน:

x = 1.0
y = 100000.0    
print x/y

1.00000e-05แสดงความฉลาดของฉันเป็น

มีวิธีใดที่จะระงับสัญกรณ์ทางวิทยาศาสตร์และทำให้มันแสดงเป็น 0.00001? ฉันจะใช้ผลลัพธ์เป็นสตริง


1
1/10000 = 0.0001 = 1.00000e-04
Adrian Archer

@AA โดยสมมติว่ามันเป็นคำที่พิมพ์ผิดในคำสั่งการมอบหมายฉันได้แก้ไขมันแล้ว
Dana

มันน่าผิดหวังที่ไม่มีคำตอบใด ๆ ที่นี่ตอบคำถาม มันคงจะดีถ้ามีวิธีป้องกัน python (3) จากการใช้สัญลักษณ์ทางวิทยาศาสตร์เลยยกเว้นเมื่อมีการระบุไว้อย่างชัดเจน คำตอบทั้งหมดต้องการให้ผู้ใช้ระงับสัญกรณ์ทางวิทยาศาสตร์อย่างชัดเจนซึ่งไม่เหมือนกับการระงับการใช้งานโดยนัยของสัญกรณ์ทางวิทยาศาสตร์จากภายในหลาม
BLUC

คำตอบ:


64
'%f' % (x/y)

แต่คุณต้องจัดการความแม่นยำด้วยตัวเอง เช่น,

'%f' % (1/10**8)

จะแสดงเลขศูนย์เท่านั้น
รายละเอียดอยู่ในเอกสาร

หรือสำหรับ Python 3 การจัดรูปแบบเก่าที่เทียบเท่าหรือการจัดรูปแบบสไตล์ที่ใหม่กว่า


7
ผมขอแนะนำให้ชี้แจงคำสั่งของคุณจะพูดว่า "คุณจัดการการแสดงผลของความแม่นยำด้วยตัวคุณเอง." ความแม่นยำที่แท้จริง (Python ภายใน) จะไม่เปลี่ยนแปลงเหมือนที่ทำในภาษาอื่น
JS

92

ใช้รุ่นที่ใหม่กว่า''.format(โปรดจำไว้ว่าต้องระบุจำนวนหลักหลังจากที่.คุณต้องการแสดงซึ่งขึ้นอยู่กับจำนวนลอยตัวที่เล็ก) ดูตัวอย่างนี้:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

ตามที่แสดงข้างต้นค่าเริ่มต้นคือ 6 หลัก! นี่ไม่เป็นประโยชน์สำหรับตัวอย่างกรณีของเราดังนั้นเราสามารถใช้สิ่งนี้แทน:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

ปรับปรุง

การเริ่มต้นใน Python 3.6 สิ่งนี้สามารถทำให้ง่ายขึ้นด้วยสตริงตัวอักษรที่จัดรูปแบบใหม่ดังนี้:

>>> f'{a:.20f}'
'-0.00000000000000007186'

วิธีการทำเช่นนี้ในขณะที่การระบุตัวเลขที่สำคัญ?
Marses

ฉันเดาด้วยการใช้ตัวแปรกำหนดจำนวนหลักที่ต้องการและใช้แทนตัวเลขตามตัวอักษรเช่นf"{a:.{precision}f}"
Aziz Alto

49

ด้วย Python เวอร์ชันใหม่กว่า (2.6 และใหม่กว่า) คุณสามารถใช้''.format()เพื่อบรรลุสิ่งที่ @SilentGhost แนะนำ:

'{0:f}'.format(x/y)

1
นี่เป็นสิ่งที่คุณต้องการจริงๆเหรอ? ฉันไม่: >>> print('{:f}'.format(0.000000123)) 0.000000
duality_

1
@duality คุณอาจต้องระบุความแม่นยำ '{0:.10f}'
nmichaels

24

อีกทางเลือกหนึ่งถ้าคุณใช้แพนด้าและต้องการที่จะระงับสัญกรณ์วิทยาศาสตร์สำหรับลอยทั้งหมดคือการปรับตัวเลือกแพนด้า

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

10

คำตอบส่วนใหญ่ข้างต้นต้องการให้คุณระบุความแม่นยำ แต่ถ้าคุณต้องการแสดงโฟลตแบบนี้โดยไม่มีศูนย์ที่ไม่จำเป็น:

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='-')

5

สิ่งนี้จะใช้ได้กับเลขชี้กำลังใด ๆ :

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

4

นี่คือการใช้คำตอบของกัปตันแตงกวาแต่มี 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

3

นอกเหนือจากคำตอบของ SG คุณยังสามารถใช้โมดูลทศนิยม:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'

14
มันหันไปทางวิทยาศาสตร์สำหรับค่าที่มีขนาดเล็กกว่า 1e-6
SilentGhost

2

หากเป็นเช่นstringนั้นให้ใช้บิวด์อินfloatเพื่อทำการแปลงตัวอย่างเช่น: print( "%.5f" % float("1.43572e-03")) answer:0.00143572


1

เนื่องจากนี่เป็นผลลัพธ์อันดับต้น ๆ ของ Google ฉันจะโพสต์ที่นี่หลังจากไม่สามารถหาวิธีแก้ไขปัญหาของฉันได้ หากคุณกำลังมองหาการจัดรูปแบบค่าการแสดงผลของวัตถุลอยและยังคงลอยอยู่ - ไม่ใช่สตริงคุณสามารถใช้วิธีนี้:

สร้างคลาสใหม่ที่ปรับเปลี่ยนวิธีการแสดงค่าลอย

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

คุณสามารถแก้ไขความแม่นยำได้ด้วยการเปลี่ยนค่าจำนวนเต็ม {:f}


-1

ใช้ 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]))

-1

ตั้งแต่ 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ป้อนข้อมูลจึงโยน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.