Pertanyaan Membatasi mengapung ke dua poin desimal


saya ingin a dibulatkan ke 13,95.

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

Itu round fungsi tidak berfungsi seperti yang saya harapkan.


1118
2018-01-18 18:16


asal


Jawaban:


Anda berlari ke masalah lama dengan angka floating point bahwa semua nomor tidak dapat diwakili. Baris perintah hanya menunjukkan kepada Anda bentuk titik mengambang penuh dari memori.

Dalam floating point, versi bulat Anda adalah angka yang sama. Karena komputer adalah biner, mereka menyimpan bilangan floating point sebagai bilangan bulat dan kemudian membaginya dengan kekuatan dua sehingga 13.95 akan direpresentasikan dengan cara yang mirip dengan 125650429603636838 / (2 ** 53).

Angka presisi ganda memiliki 53 bit (16 digit) dari presisi dan mengapung reguler memiliki 24 bit (8 digit) presisi. Itu floating point dalam Python menggunakan presisi ganda untuk menyimpan nilai-nilai.

Sebagai contoh,

  >>> 125650429603636838/(2**53)
  13.949999999999999

  >>> 234042163/(2**24)
  13.949999988079071

  >>> a=13.946
  >>> print(a)
  13.946
  >>> print("%.2f" % a)
  13.95
  >>> round(a,2)
  13.949999999999999
  >>> print("%.2f" % round(a,2))
  13.95
  >>> print("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

Jika Anda hanya memiliki dua tempat desimal seperti dalam mata uang maka Anda memiliki beberapa pilihan yang lebih baik: 1) Gunakan bilangan bulat dan simpan nilai dalam sen, bukan dolar dan kemudian bagi dengan 100 untuk dikonversi ke dolar. 2) Atau gunakan angka titik tetap seperti desimal.


1154
2018-01-18 18:23



Ada spesifikasi format baru, Format String Spesifikasi Bahasa Mini:

Anda dapat melakukan hal yang sama seperti:

"{0:.2f}".format(13.949999999999999)

Catatan bahwa di atas mengembalikan string. Agar bisa mengapung, cukup bungkus float(...):

float("{0:.2f}".format(13.949999999999999))

Catatan yang membungkus dengan float() tidak mengubah apa pun:

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{0:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

423
2018-06-30 18:53



Built-in round() bekerja dengan baik di Python 2.7 atau yang lebih baru.

Contoh:

>>> round(14.22222223, 2)
14.22

Periksa dokumentasi.


138
2017-12-31 10:51



Saya merasa bahwa pendekatan yang paling sederhana adalah menggunakan format() fungsi.

Sebagai contoh:

a = 13.949999999999999
format(a, '.2f')

13.95

Ini menghasilkan bilangan float sebagai string dibulatkan ke dua poin desimal.


118
2018-01-25 22:26



Sebagian besar angka tidak dapat diwakili dengan tepat dalam pelampung. Jika Anda ingin membulatkan angka karena itulah rumus atau algoritma matematis yang Anda butuhkan, maka Anda ingin menggunakan putaran. Jika Anda hanya ingin membatasi tampilan dengan ketepatan tertentu, maka jangan gunakan putaran dan format saja sebagai string itu. (Jika Anda ingin menampilkannya dengan beberapa metode pembulatan alternatif, dan ada ton, maka Anda perlu mencampur dua pendekatan.)

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

Dan terakhir, meski mungkin yang paling penting, jika Anda mau tepat matematika maka Anda tidak ingin mengapung sama sekali. Contoh yang biasa adalah berurusan dengan uang dan menyimpan sen sebagai bilangan bulat.


85
2018-01-18 18:40



Coba kode di bawah ini:

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99

65
2017-08-26 06:46



Dengan Python <3 (misalnya 2.6 atau 2.7), ada dua cara untuk melakukannya.

# Option one 
older_method_string = "%.9f" % numvar

# Option two (note ':' before the '.9f')
newer_method_string = "{:.9f}".format(numvar)

Tetapi perhatikan bahwa untuk versi Python di atas 3 (misalnya 3.2 atau 3.3), opsi dua adalah disukai.

Untuk informasi lebih lanjut tentang opsi kedua, saya sarankan tautan ini pemformatan string dari dokumentasi Python.

Dan untuk informasi lebih lanjut tentang opsi pertama, tautan ini akan mencukupi dan memiliki informasi tentang berbagai bendera.

Referensi: Konversikan angka floating point ke presisi tertentu, lalu salin ke string


49
2017-12-11 06:37



Anda dapat memodifikasi format output:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95

39
2018-01-18 18:31