Pertanyaan desimal vs ganda! - Yang mana yang harus saya gunakan dan kapan? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya terus melihat orang menggunakan ganda di C #. Saya tahu saya membaca di suatu tempat yang menggandakan terkadang kehilangan presisi. Pertanyaan saya adalah kapan harus menggunakan dobel dan kapan saya harus menggunakan tipe desimal? Jenis apa yang cocok untuk perhitungan uang? (mis. lebih dari $ 100 juta)


756
2017-07-22 14:37


asal


Jawaban:


Untuk uang, selalu desimal. Itu sebabnya itu dibuat.

Jika angka harus dijumlah dengan benar atau seimbang, gunakan desimal. Ini termasuk penyimpanan keuangan atau perhitungan, skor, atau angka lain yang mungkin dilakukan orang dengan tangan.

Jika nilai pasti angka tidak penting, gunakan ganda untuk kecepatan. Ini termasuk grafik, fisika atau perhitungan ilmu fisik lainnya di mana sudah ada "sejumlah angka penting".


901
2017-07-22 14:42



Pertanyaan saya adalah kapan sebaiknya menggunakan a   ganda dan kapan saya harus menggunakan desimal   mengetik?

decimal ketika Anda bekerja dengan nilai-nilai dalam kisaran 10 ^ (+/- 28) dan di mana Anda memiliki ekspektasi tentang perilaku berdasarkan basis 10 representasi - pada dasarnya uang.

double ketika Anda membutuhkannya relatif keakuratan (yaitu kehilangan presisi dalam angka-angka yang tertinggal pada nilai-nilai besar bukan masalah) di seluruh besaran yang sangat berbeda - double mencakup lebih dari 10 ^ (+/- 300). Perhitungan ilmiah adalah contoh terbaik di sini.

jenis yang cocok untuk uang   perhitungan?

desimal, desimal, desimal

Terima tidak ada pengganti.

Faktor yang paling penting adalah itu double, diimplementasikan sebagai pecahan biner, tidak dapat secara akurat mewakili banyak decimal fraksi (seperti 0,1) sama sekali dan jumlah digit keseluruhannya lebih kecil karena lebar 64-bit vs 128-bit decimal. Akhirnya, aplikasi keuangan sering harus mengikuti spesifik mode pembulatan (terkadang diamanatkan oleh hukum). decimal  mendukung ini; double tidak.


157
2017-07-22 15:12



System.Single / mengapung - 7 digit
System.Double / dua kali lipat - 15-16 digit
System.Decimal / desimal - 28-29 digit signifikan

Cara saya disengat dengan menggunakan jenis yang salah (beberapa tahun yang lalu) adalah dengan jumlah besar:

  • £ 520.532,52 - 8 digit
  • £ 1,323,523.12 - 9 digit

Anda kehabisan 1 juta untuk pelampung.

Nilai uang 15 digit:

  • £ 1,234,567,890,123.45

9 trilyun dengan dobel. Tetapi dengan pembagian dan perbandingan itu lebih rumit (saya pasti tidak ahli dalam hal floating point dan bilangan irasional - lihat poin Marc). Mencampur desimal dan ganda menyebabkan masalah:

Operasi matematis atau perbandingan   yang menggunakan angka floating-point   mungkin tidak menghasilkan hasil yang sama jika a   angka desimal digunakan karena   nomor floating-point mungkin tidak   tepatnya perkiraan desimal   jumlah.

Kapan saya harus menggunakan dobel bukannya desimal?memiliki beberapa jawaban yang mirip dan lebih mendalam.

Menggunakan double dari pada decimal  untuk aplikasi moneter adalah mikro-optimasi - itulah cara paling sederhana yang saya lihat.


34
2018-02-04 12:06



Desimal adalah untuk nilai-nilai yang tepat. Ganda adalah untuk nilai perkiraan.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

32
2017-07-22 14:59



Untuk uang: decimal. Biayanya sedikit lebih banyak memori, tetapi tidak memiliki masalah seperti bulat double kadang-kadang memiliki.


23
2017-07-22 14:39



Pastinya gunakan jenis integer untuk perhitungan uang Anda. Ini tidak dapat ditekankan cukup, karena pada pandangan pertama mungkin tampak bahwa tipe titik apung cukup memadai.

Berikut contoh dalam kode python:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

terlihat sangat normal.

Sekarang coba lagi dengan 10 ^ 20 dolar Zimbabwe

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

Seperti yang Anda lihat, dolar menghilang.

Jika Anda menggunakan tipe integer, itu berfungsi dengan baik:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1

6
2017-07-22 14:56



Saya pikir bahwa perbedaan utama di samping lebar bit adalah bahwa desimal memiliki basis eksponen 10 dan ganda memiliki 2

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html


4
2017-11-26 13:23