Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

Bạn có thể sử dụng các số âm cho số nguyên tròn:

>>> round(1234, -3)
1000.0

Do đó, nếu bạn chỉ cần chữ số quan trọng nhất:

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0

Có lẽ bạn sẽ phải quan tâm đến việc chuyển phao sang số nguyên nếu nó lớn hơn 1.

Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

Đã trả lời ngày 5 tháng 8 năm 2010 lúc 2:57Aug 5, 2010 at 2:57

13

%g trong định dạng chuỗi sẽ định dạng một float được làm tròn đến một số số liệu quan trọng. Đôi khi nó sẽ sử dụng ký hiệu khoa học 'e', ​​do đó chuyển đổi chuỗi tròn trở lại một chiếc phao sau đó thông qua định dạng chuỗi %s.

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'

Đã trả lời ngày 5 tháng 8 năm 2010 lúc 4:24Aug 5, 2010 at 4:24

Peter Grahampeter GrahamPeter Graham

10,9k7 Huy hiệu vàng38 Huy hiệu bạc42 Huy hiệu đồng7 gold badges38 silver badges42 bronze badges

10

Nếu bạn muốn có ngoài 1 thập phân đáng kể (nếu không thì giống như Evgeny):

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0

Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

Stephen Rauch ♦

45,9K31 Huy hiệu vàng106 Huy hiệu bạc126 Huy hiệu Đồng31 gold badges106 silver badges126 bronze badges

Đã trả lời ngày 5 tháng 8 năm 2010 lúc 9:49Aug 5, 2010 at 9:49

INDGARINDGARindgar

6894 Huy hiệu bạc2 Huy hiệu đồng4 silver badges2 bronze badges

8

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))

Giải pháp này khác với tất cả các giải pháp khác bởi vì:

  1. nó chính xác giải quyết câu hỏi OPexactly solves the OP question
  2. nó không cần bất kỳ gói bổ sung nàonot need any extra package
  3. Nó không cần bất kỳ chức năng phụ trợ hoặc hoạt động toán học do người dùng xác địnhnot need any user-defined auxiliary function or mathematical operation

Đối với một số tùy ý

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
4 của các số liệu quan trọng, bạn có thể sử dụng:

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))

Test:

a = [1234, 0.12, 0.012, 0.062, 6253, 1999, -3.14, 0., -48.01, 0.75]
b = ['{:g}'.format(float('{:.1g}'.format(i))) for i in a]
# b == ['1000', '0.1', '0.01', '0.06', '6000', '2000', '-3', '0', '-50', '0.8']

Lưu ý: Với giải pháp này, không thể điều chỉnh số lượng số liệu có ý nghĩa động từ đầu vào vì không có cách nào tiêu chuẩn để phân biệt các số với số lượng số 0 khác nhau (

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
5). Nếu bạn cần phải làm như vậy, thì các chức năng không chuẩn như các chức năng được cung cấp trong gói TOÁN là cần thiết.

Andy Jones

4.4452 Huy hiệu vàng17 Huy hiệu bạc21 Huy hiệu đồng2 gold badges17 silver badges21 bronze badges

Đã trả lời ngày 15 tháng 2 năm 2018 lúc 17:10Feb 15, 2018 at 17:10

FalkenfalkenFalken

7595 Huy hiệu bạc8 Huy hiệu Đồng5 silver badges8 bronze badges

9

Để trả lời trực tiếp câu hỏi, đây là phiên bản của tôi bằng cách sử dụng đặt tên từ hàm R:

import math

def signif(x, digits=6):
    if x == 0 or not math.isfinite(x):
        return x
    digits -= math.ceil(math.log10(abs(x)))
    return round(x, digits)

Lý do chính của tôi để đăng câu trả lời này là các bình luận phàn nàn rằng các vòng "0,075" đến 0,07 thay vì 0,08. Điều này là do, như được chỉ ra bởi "Novice C", với sự kết hợp của số học điểm nổi có cả độ chính xác hữu hạn và biểu diễn cơ sở-2. Số gần nhất đến 0,075 thực sự có thể được biểu diễn nhỏ hơn một chút, do đó làm tròn xuất hiện khác với bạn có thể mong đợi.

Cũng lưu ý rằng điều này áp dụng cho bất kỳ việc sử dụng số học điểm nổi không phân rã, ví dụ: C và Java đều có cùng một vấn đề.

Để hiển thị chi tiết hơn, chúng tôi yêu cầu Python định dạng số theo định dạng "hex":

0.075.hex()

Điều này cung cấp cho chúng tôi:

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
6. Lý do để làm điều này là vì biểu diễn thập phân bình thường thường liên quan đến việc làm tròn và do đó không phải là cách máy tính thực sự "nhìn thấy" số. Nếu bạn không quen với định dạng này, một vài tài liệu tham khảo hữu ích là tài liệu Python và tiêu chuẩn C.

Để chỉ ra cách những con số này hoạt động một chút, chúng ta có thể quay lại điểm xuất phát của mình bằng cách thực hiện:

0x13333333333333 / 16**13 * 2**-4

mà nên in ra

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
7.
f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
8 là do có 13 chữ số thập lục phân sau điểm thập phân và
f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
9 là vì số mũ Hex là cơ sở-2.

Bây giờ chúng tôi có một số ý tưởng về cách các phao được thể hiện, chúng tôi có thể sử dụng mô -đun

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
0 để cung cấp cho chúng tôi một số độ chính xác hơn, cho chúng tôi thấy những gì đang diễn ra:

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
0

Give:

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
1 và hy vọng giải thích lý do tại sao
print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
2 đánh giá thành
print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
3

Đã trả lời ngày 10 tháng 7 năm 2019 lúc 16:21Jul 10, 2019 at 16:21

Sam Masonsam MasonSam Mason

Huy hiệu vàng 13.7K11 gold badge36 silver badges53 bronze badges

8

Tôi đã tạo ra chính xác theo gói thực hiện những gì bạn muốn. Nó cho phép bạn cung cấp cho số của bạn nhiều hơn hoặc ít hơn các số liệu có ý nghĩa.

Nó cũng đưa ra ký hiệu tiêu chuẩn, khoa học và kỹ thuật với một số lượng số liệu có ý nghĩa cụ thể.

Trong câu trả lời được chấp nhận, có dòng

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
1

Điều đó thực sự chỉ định 8 hình sig. Đối với số 1234243 Thư viện của tôi chỉ hiển thị một con số quan trọng:

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
2

Nó cũng sẽ làm tròn con số quan trọng cuối cùng và có thể tự động chọn những gì ký hiệu sẽ sử dụng nếu một ký hiệu không được chỉ định:

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
3

offby1

6.41830 Huy hiệu bạc45 Huy hiệu Đồng30 silver badges45 bronze badges

Đã trả lời ngày 23 tháng 5 năm 2017 lúc 11:59May 23, 2017 at 11:59

Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

7

Để làm tròn một số nguyên đến 1 con số quan trọng, ý tưởng cơ bản là chuyển đổi nó thành một điểm nổi với 1 chữ số trước điểm và vòng, sau đó chuyển đổi nó trở lại kích thước nguyên ban đầu của nó.

Để làm điều này, chúng ta cần biết sức mạnh lớn nhất 10 ít hơn số nguyên. Chúng ta có thể sử dụng sàn của hàm nhật ký 10 cho việc này.

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
4

Đã trả lời ngày 4 tháng 3 năm 2012 lúc 18:18Mar 4, 2012 at 18:18

0

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
5

Hy vọng rằng hãy lấy những câu trả lời tốt nhất ở trên (trừ có thể đặt nó như một Lambda một dòng;)). Chưa khám phá, hãy thoải mái chỉnh sửa câu trả lời này:

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
6

Tôi đã sửa đổi giải pháp của Indgar để xử lý các số âm và số nhỏ (bao gồm cả bằng không).

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
7

Đã trả lời ngày 26 tháng 3 năm 2016 lúc 19:50Mar 26, 2016 at 19:50

4

Câu trả lời được đăng là tốt nhất có sẵn khi được đưa ra, nhưng nó có một số hạn chế và không tạo ra các số liệu có ý nghĩa chính xác về mặt kỹ thuật.

numpy.format_float_poseitional hỗ trợ trực tiếp hành vi mong muốn. Các đoạn sau đây trả về float

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
4 được định dạng cho 4 con số quan trọng, với ký hiệu khoa học bị triệt tiêu.

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
8

Đã trả lời ngày 21 tháng 10 năm 2019 lúc 17:01Oct 21, 2019 at 17:01

AutumnautumnAutumn

2.7561 Huy hiệu vàng18 Huy hiệu bạc32 Huy hiệu đồng1 gold badge18 silver badges32 bronze badges

1

Tôi không thể nghĩ ra bất cứ điều gì có thể xử lý việc này ra khỏi hộp. Nhưng nó được xử lý khá tốt cho số điểm nổi.

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0
9

Số nguyên là khó khăn hơn. Chúng không được lưu trữ dưới dạng cơ sở 10 trong bộ nhớ, vì vậy những nơi quan trọng không phải là điều tự nhiên để làm. Nó khá tầm thường để thực hiện một khi chúng là một chuỗi.

Hoặc cho số nguyên:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
0

Nếu bạn muốn tạo một hàm xử lý bất kỳ số nào, sở thích của tôi sẽ là chuyển đổi cả hai thành chuỗi và tìm kiếm một nơi thập phân để quyết định phải làm gì:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
1

Một tùy chọn khác là kiểm tra loại. Điều này sẽ kém linh hoạt hơn và có thể sẽ không chơi độc đáo với các số khác như đối tượng

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
5:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
2

Đã trả lời ngày 5 tháng 8 năm 2010 lúc 1:35Aug 5, 2010 at 1:35

Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

Tim McNamaratim McNamaraTim McNamara

17.7K4 Huy hiệu vàng51 Huy hiệu bạc82 Huy hiệu Đồng4 gold badges51 silver badges82 bronze badges

2

Nếu bạn muốn làm tròn mà không liên quan đến chuỗi, liên kết tôi tìm thấy được chôn trong các bình luận ở trên:

http://code.activestate.com/lists/python-tutor/70739/

đánh tôi là tốt nhất. Sau đó, khi bạn in với bất kỳ mô tả định dạng chuỗi nào, bạn sẽ nhận được đầu ra hợp lý và bạn có thể sử dụng biểu diễn số cho các mục đích tính toán khác.

Mã tại liên kết là ba lớp lót: def, doc và return. Nó có một lỗi: Bạn cần kiểm tra các logarit phát nổ. Điều đó thật dễ. So sánh đầu vào với

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
6. Giải pháp hoàn chỉnh là:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
3

Nó hoạt động cho bất kỳ giá trị số vô hướng nào và N có thể là

print('{:g}'.format(float('{:.{p}g}'.format(i, p=n))))
7 nếu bạn cần thay đổi phản hồi vì một số lý do. Bạn thực sự có thể đẩy giới hạn đến:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
4

Không gây ra lỗi, nếu vì một lý do nào đó bạn đang làm việc với các giá trị rất nhỏ.

Đã trả lời ngày 13 tháng 4 năm 2018 lúc 6:49Apr 13, 2018 at 6:49

Gói/thư viện SIGFIG bao gồm điều này. Sau khi cài đặt, bạn có thể làm như sau:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
5

Đã trả lời ngày 30 tháng 11 năm 2019 lúc 17:32Nov 30, 2019 at 17:32

HyperacyShyperActiveHyperActive

8919 Huy hiệu bạc11 Huy hiệu đồng9 silver badges11 bronze badges

Sử dụng Python 2.6+ Định dạng kiểu mới (AS %-Style không dùng nữa):

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
6

Trong Python 2.7+, bạn có thể bỏ qua các ____58 hàng đầu.

Đã trả lời ngày 8 tháng 1 năm 2018 lúc 13:34Jan 8, 2018 at 13:34

Eddygeekeddygeekeddygeek

3,8692 Huy hiệu vàng22 Huy hiệu bạc29 Huy hiệu đồng2 gold badges22 silver badges29 bronze badges

2

Tôi đã điều chỉnh một trong những câu trả lời. Tôi thích điều này:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
7

Tôi sử dụng nó khi tôi vẫn muốn một chiếc phao (tôi định dạng ở nơi khác).

Đã trả lời ngày 17 tháng 12 năm 2021 lúc 15:21Dec 17, 2021 at 15:21

Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

MykmykMYK

1.0975 huy hiệu bạc12 Huy hiệu đồng5 silver badges12 bronze badges

1

Tôi cũng gặp phải điều này nhưng tôi cần kiểm soát loại làm tròn. Do đó, tôi đã viết một hàm nhanh (xem mã bên dưới) có thể tính đến giá trị, loại làm tròn và các chữ số đáng kể mong muốn vào tài khoản.

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
8

Đã trả lời ngày 28 tháng 9 năm 2017 lúc 16:52Sep 28, 2017 at 16:52

drew.raydrew.raydrew.ray

Phim huy hiệu bạc 211 Huy hiệu đồng1 silver badge3 bronze badges

Hàm này thực hiện một vòng bình thường nếu số lượng lớn hơn 10 ** (-Decimal_Pocations), nếu không sẽ thêm số thập phân cho đến khi đạt được số lượng vị trí thập phân có ý nghĩa: đạt được:

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
9

Hy vọng nó giúp.

Đã trả lời ngày 19 tháng 7 năm 2018 lúc 9:38Jul 19, 2018 at 9:38

https://stackoverflow.com/users/1391441/gabriel, sau đây có đề cập đến mối quan tâm của bạn về RND (.075, 1) không? Hãy cẩn thận: Trả về giá trị như một chiếc phao

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
0

Đã trả lời ngày 22 tháng 2 năm 2019 lúc 18:46Feb 22, 2019 at 18:46

Điều này trả về một chuỗi, do đó kết quả không có các phần phân số và các giá trị nhỏ sẽ xuất hiện trong ký hiệu E được hiển thị chính xác:

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
1

Đã trả lời ngày 15 tháng 3 năm 2019 lúc 12:04Mar 15, 2019 at 12:04

GnubiegnubieGnubie

2.5574 Huy hiệu vàng25 Huy hiệu bạc38 Huy hiệu Đồng4 gold badges25 silver badges38 bronze badges

Đưa ra một câu hỏi được trả lời kỹ lưỡng tại sao không thêm một câu hỏi khác

Điều này phù hợp với thẩm mỹ của tôi tốt hơn một chút, mặc dù nhiều điều trên có thể so sánh

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
2

Điều này hoạt động cho các số riêng lẻ và mảng numpy, và sẽ hoạt động tốt cho các số âm.

Có một bước bổ sung mà chúng tôi có thể thêm -np.round () trả về số thập phân ngay cả khi tròn là một số nguyên (nghĩa là đối với các hình dạng quan trọng = 2, chúng tôi có thể mong đợi lấy lại -460 nhưng thay vào đó chúng tôi nhận được -460.0). Chúng ta có thể thêm bước này để sửa cho điều đó:

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
3

Thật không may, bước cuối cùng này sẽ không hoạt động cho một loạt các số - Tôi sẽ để nó cho bạn đọc thân yêu để tìm hiểu nếu bạn cần.

Đã trả lời ngày 3 tháng 8 năm 2019 lúc 8:59Aug 3, 2019 at 8:59

Zephyrzephyrzephyr

2152 Huy hiệu bạc13 Huy hiệu Đồng2 silver badges13 bronze badges

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
4

Đã trả lời ngày 26 tháng 3 năm 2020 lúc 21:29Mar 26, 2020 at 21:29

LetzerwilleletzerwilleLetzerWille

5.2214 Huy hiệu vàng22 Huy hiệu bạc26 Huy hiệu đồng4 gold badges22 silver badges26 bronze badges

4

Hầu hết các câu trả lời này liên quan đến nhập khẩu toán học, thập phân và/hoặc vô hiệu hóa hoặc giá trị đầu ra dưới dạng chuỗi. Dưới đây là một giải pháp đơn giản trong Python cơ sở xử lý cả số lượng lớn và nhỏ và đầu ra một chiếc phao:

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
5

Đã trả lời ngày 16 tháng 12 năm 2020 lúc 18:23Dec 16, 2020 at 18:23

Hướng dẫn python significant digits after decimal - python chữ số có nghĩa sau số thập phân

Một biến thể đơn giản sử dụng thư viện thập phân tiêu chuẩn

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
6

Kiểm tra nó

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
7

Đã trả lời ngày 4 tháng 9 năm 2021 lúc 21:47Sep 4, 2021 at 21:47

Hàm này có cả số dương và số âm và làm tròn chữ số có ý nghĩa thích hợp.

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
8

Testing:

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
9

Đã trả lời ngày 7 tháng 12 năm 2021 lúc 15:08Dec 7, 2021 at 15:08

Dễ dàng biết một câu trả lời phù hợp với nhu cầu của bạn khi nó bao gồm các ví dụ. Sau đây được xây dựng trên các giải pháp trước đó, nhưng cung cấp một chức năng tổng quát hơn có thể làm tròn đến 1, 2, 3, 4 hoặc bất kỳ số chữ số quan trọng nào.

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
0

Đã trả lời ngày 22 tháng 4 lúc 20:01Apr 22 at 20:01

Chadnchadnchadn

2491 huy hiệu vàng2 huy hiệu bạc7 huy hiệu đồng1 gold badge2 silver badges7 bronze badges

Trong chính trường hợp, số lượng đáng kể phụ thuộc vào quá trình được đánh giá, ví dụ: lỗi. Tôi đã viết một số mã trả về một số theo lỗi của nó (hoặc với một số chữ số mong muốn) và cả ở dạng chuỗi (không loại bỏ các số không đáng kể bên phải)

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
1

mã kiểm tra:

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
2

in ra:

f'{float(f"{i:.1g}"):g}'
# Or with Python <3.6,
'{:g}'.format(float('{:.1g}'.format(i)))
3

Đã trả lời ngày 17 tháng 9 lúc 16:11Sep 17 at 16:11

Làm thế nào để bạn sử dụng .2f trong Python?

2F là một trình giữ chỗ cho số điểm nổi.Vì vậy, %D được thay thế bằng giá trị đầu tiên của tuple tức là 12 và %.2F được thay thế bằng giá trị thứ hai I.E 150.87612.... Định dạng chuỗi Python ..

Làm thế nào để bạn giữ 2 chữ số sau một số thập phân trong Python?

Thuật toán (bước)..
Tạo một biến để lưu trữ số đầu vào ..
Truyền số đầu vào, 2 (giá trị thập phân) làm đối số cho hàm vòng () để làm tròn số đầu vào lên đến 2 số thập phân ..
In giá trị tròn của số dấu nổi đầu vào lên đến 2 số thập phân ..

Làm thế nào để bạn có được các chữ số sau một số thập phân trong Python?

Làm thế nào để bạn có được số sau điểm thập phân trong Python?modf () để có được các chữ số sau điểm thập phân.Gọi toán học.modf (x) để trả về một tuple với các phần phân số và số nguyên của x.modf() to get the digits after the decimal point. Call math. modf(x) to return a tuple with the fraction and integer parts of x .

Làm thế nào để bạn đặt các chữ số quan trọng trong Python?

' + str (p) +' e ') % f) Cho phép bạn điều chỉnh số chữ số quan trọng! allows you to adjust the number of significant digits!