Bisakah Anda membantu - karena saya memiliki situasi aneh bahwa ketika saya memasukkan nomor 22222.09482 dalam sel maka saya melihat nomor yang berbeda 22222.0948199999 di bilah rumus. Di bawah ini adalah cuplikan dari masalahnya.
Saya melihat perilaku yang sama ketika saya memasukkan angka-angka berikut:
22222.09482
33333.09482
44444.09482
55555.09482
tetapi ketika saya memasukkan 11111.09482 dan 66666.09482, 77777.09482 .. sampai 99999.09482 maka mereka menunjukkan dengan benar. Saya tidak yakin apakah ini terkait dengan pembulatan? Saya tidak menyiapkan profil pembulatan. Bisakah Anda membantu saya menyelesaikan masalah ini?
microsoft-excel
microsoft-excel-2016
pengguna954171
sumber
sumber
ROUND()
?=ROUND(A1,5)
, lalu salin / tempel data sebagai Nilai dan hapus nomor aslinya?ROUND()
menunjukkan angka yang benar tetapi nilai salin / tempel membawanya kembali ke masalah awal!ROUND(A1,5)
lagi pada nilai yang ditempelkan. Kemudian salin / tempel sebagai nilai, danRound()
lagi, lalu salin / tempel. ...: P ... itu menarik, dan sepertinya @EugenRieck punya alasan. Pertanyaan bagus!double
memiliki presisi yang cukup bahwa ketika dibulatkan menunjukkan nilai yang benar seperti yang diharapkan kebanyakan orangJawaban:
Itu adalah bug.
Excel menggunakan representasi presisi ganda IEEE yang biasa, menurut jawaban lain. Ketepatannya adalah 53 digit biner yang signifikan, yang sesuai dengan kira-kira 16 digit desimal.
Itu selalu "aman" untuk menampilkan 15 angka desimal signifikan pertama. Dalam arti bahwa setiap angka "disajikan" desimal yang diberikan dengan 15 digit dapat dengan aman dibedakan dari angka-angka yang diperoleh dengan mengubah angka desimal ke-15 satu. Misalnya, angka 15 digit:
peta ke tiga angka presisi ganda yang berbeda . Tidak satu pun dari ketiga ini akan menjadi "tetangga" dalam representasi presisi ganda, dalam kasus khusus ini.
Jadi, membingungkan dua yang pertama di layar pengguna, adalah bug dari Excel.
Bahkan, dalam domain ini (antara 16384 dan 32768), ketepatan absolutnya adalah 2 -38 , dan angka-angka berikut ini dapat diwakili:
Untuk menguraikan lebih jauh, cobalah mengetik
22222.09482
di satu sel, dan mengetik22222.0948199999
(lima trailing nines) di sel lain. Excel harus memilih dua perwakilan IEEE yang ditunjukkan oleh panah di atas. Dan saya pikir itu benar, karena Anda dapat menghitung perbedaan dari dua sel ini untuk mendapatkannya9.82254E-11
. Namun keduanya ditampilkan dengan cara yang sama.Jika Excel telah menunjukkan 17 digit pertama, itu akan membantu untuk memilih dengan tepat apa nomor IEEE "di bawah" angka desimal. Dalam hal itu:
Tetapi menunjukkan 15 digit dibulatkan dengan cara yang salah, menyesatkan dan tidak membantu.
Sebelum ada yang mengklaim itu disengaja, lalu mengapa
8.7
tidak menunjukkan perilaku yang sama? Nomor presisi ganda terdekat8.7
adalah:jadi itu harus menunjukkan seolah
8.69999999999999
ini disengaja. Tapi ternyata tidak.sumber
2.1 + 2.2
kembali4.80000001
?" dan mendapatkan banyak jawaban dengan mengatakan bahwa itulah yang harus saya harapkan ketika saya menggunakan floating point.Excel menyimpan angka dalam format floating point 64-bit biner IEEE 754 . Kuncinya adalah "toko" - perubahan dari desimal ke biner terjadi setiap kali nomor disimpan, bukan hanya ketika digunakan dalam perhitungan aktual.
Artikel bagus tentang ini ada di Understanding Floating Point Precision, alias “Mengapa Excel Memberi Saya Jawaban yang Salah?”
Dimungkinkan untuk membuat program spreadsheet yang akan menangani angka sangat besar dengan banyak angka signifikan. Tapi itu tidak terlalu praktis. Excel dapat dirancang untuk menggunakan format IEEE 754 decimal128 , yang memungkinkan 34 angka desimal - lebih dari cukup untuk menyimpan 22222.09482. Tetapi sebaliknya menggunakan format binary64 Double Precision yang jauh lebih umum , yang memiliki presisi 53 bit, yang hanya di bawah 16 digit. Meskipun Anda mungkin berpikir itu akan cukup untuk angka dengan hanya 10 digit di dalamnya, konversi dari desimal ke biner sedikit mempersulit - yaitu, 2222209482 dapat disimpan 100% dengan benar sebagai angka binary64, tetapi 22222.09482 tidak dapat.
Ingatlah bahwa spreadsheet biasanya digunakan untuk data keuangan, yang biasanya tidak memerlukan begitu banyak digit ketepatan, atau untuk pemodelan "bagaimana jika" dalam berbagai skenario, di mana tingkat presisi super tinggi tidak diperlukan. Tentu saja ada alat-alat lain (dan mungkin program spreadsheet lainnya, tetapi saya belum mencari akhir-akhir ini) yang secara default atau dengan pengaturan konfigurasi khusus dapat menggunakan format numerik yang lebih besar, tetapi Excel bukan salah satunya.
Bagi mereka yang menunjukkan bahwa LibreOffice menangani ini dengan lebih baik, penampilan dapat menipu. Lihat posting ini untuk lebih jelasnya. Tampaknya LibreOffice menangani angka besar sedikit berbeda tetapi memiliki representasi floating point 64-bit dasar yang sama dengan masalah yang sama.
sumber
22222.09482
disimpan seperti1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)
di IEEE 754, atau dengan kata lain tepatnya1.35632902954101553 * 2^14
, yaitu22222.0948199999984353787904
.0.2
dan0.1
tidak dapat diwakili secara tepat (fraksi 1/5 (seperlima) memiliki ekspansi biner berulang yang tak terbatas). Namun, Excel menunjukkan hal-hal dengan cara yang membingungkan.Money
atauBigInteger
format, yang sering menggunakan format penyimpanan desimal .Saat melakukan perhitungannya, Excel perlu menemukan representasi biner internal yang baik untuk angka yang digunakannya. Dalam kasus Anda, ia menggunakan angka floating point, dan pada kenyataannya format data ini memiliki perkiraan (sangat bagus) untuk nomor Anda, tetapi tidak ada kecocokan persis. Jadi, jika Anda tidak secara eksplisit memberi tahu Excel format output mana yang akan digunakan, itu akan melakukan "upaya terbaik", menghasilkan output yang lebih dekat dengan nilai yang dihitung secara internal, tetapi bukan teks yang Anda masukkan.
Hanya untuk memperjelas ini: Memahami, bahwa teks yang Anda masukkan mewakili angka dan mengubah urutan angka menjadi angka sudah memenuhi definisi "perhitungan" dari atas.
EDIT
Saya belum membuatnya cukup jelas, bahwa saya menganggap pilihan menggunakan representasi titik mengambang 64 bit sebenarnya bagus: Excel tidak ment sebagai alat untuk Ilmuwan, di mana kesalahan pembulatan dalam digit ke-11 setelah titik desimal menghasilkan dampak besar, tetapi akuntan tidak ingin kecepatan pemrosesan mereka dikurangi dengan faktor jutaan untuk mengakomodasi sumber perhitungan yang tidak tepat yang mungkin memanifestasikan dirinya dalam jumlah yang tidak pernah mereka gunakan.
Jika Anda menggunakan program spreadsheet untuk apa itu dirancang dan menggunakan format output eksplisit untuk memastikan efek tersebut tidak pernah membuatnya menjadi ranah yang terlihat, Anda akan baik-baik saja.
sumber
Beberapa angka dapat direpresentasikan dengan benar dan beberapa tidak.
Atur presisi yang ditampilkan dengan tepat untuk perhitungan Anda dan gunakan fungsi putaran () .
Penjelasan:
Wikipedia - " Ketepatan angka dalam Microsoft Excel "
Panduan Perhitungan Numerik Oracle - " Apa Yang Harus Diketahui Setiap Ilmuwan Mengenai Aritmatika Titik Apung "
Larutan:
Jurnal Akuntansi - " Disadap oleh kesalahan perhitungan Excel ":
sumber
Seperti yang saya yakin Anda tahu, komputer secara internal hanya bekerja menggunakan nol dan yang (alias bit) dan memiliki jumlah bit yang tetap untuk mewakili nilai (biasanya 64 bit saat ini). Itu berarti bahwa jumlah nilai yang berbeda yang dapat diwakili adalah 2 pangkat 64. Itu angka yang sangat besar, tentu saja, tetapi jumlah nilai yang mungkin terbatas, sehingga tidak semua angka dapat diwakili. Ketika menemukan angka yang tidak dapat diwakilinya secara tepat, secara otomatis akan diganti dengan yang terdekat yang dapat diwakilinya. Itu yang kau lihat.
sumber
Komputer melakukan matematika mereka dalam biner, dan hampir selalu menggunakan floating point untuk nilai-nilai non-integer. Satu-satunya nilai fraksional yang dapat direpresentasikan secara tepat dalam floating point harus merupakan penjumlahan dari beberapa kombinasi kekuatan fraksional dari 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...) terminating pada batas presisi yang dirancang-dalam (biasanya 53 bit). Nilai-nilai ini tidak selalu memiliki representasi yang rapi atau tepat dalam desimal, dan sebaliknya, tidak semua nilai fraksional yang Anda dapat wakili dengan tepat dalam desimal akan memiliki representasi yang tepat dalam biner. Misalnya: 0,1. Itu tidak dapat direpresentasikan sebagai jumlah kekuatan pecahan dari 2 yang tidak berlangsung selamanya.
Ketika Anda memasukkan nilai desimal ke dalam spreadsheet Anda, itu akan dikonversi dan disimpan dalam biner, dan kasus-kasus seperti yang Anda jelaskan, akan menjadi perkiraan terdekat yang dapat direpresentasikan dalam biner. Ketika ditampilkan, itu dikonversi kembali ke desimal, lagi-lagi membutuhkan perkiraan, yang mungkin tidak dikonversi kembali ke representasi yang sama persis seperti yang Anda masukkan.
Mengapa 53 bit (memberi atau menerima)? Karena standar tipikal untuk menyimpan floating point "presisi ganda" menggunakan 64 bit, di mana terdapat mantissa (juga disebut signifikansi), indikator tanda, dan eksponen. Eksponen biasanya dialokasikan 10 bit, tandanya mengambil satu, meninggalkan 53 untuk mantissa. Ini untuk penyimpanan. Perhitungan biasanya dilakukan dengan menggunakan 80 bit dan dibulatkan ke belakang.
Ada situasi di mana komputer akan bekerja di basis 10, terutama ketika bekerja dengan nilai moneter di mana artefak pembulatan tidak dapat diterima.
sumber
Seperti yang dikatakan banyak orang di atas, ini adalah kesalahan representasi internal. Excel telah membuat pilihan untuk angka floating point presisi ganda, 64 bit. Ini memberi Anda 2 64 nilai yang mungkin. Domain bilangan real berisi tak terhingga nilai, jadi ketika Anda mencoba menggunakan yang tidak bisa diwakili oleh Excel, itu akan menggunakan yang terdekat yang bisa diwakili.
Saya telah melihat komentar yang mengatakan bahwa mengingat memori tak terbatas, bilangan real apa pun dapat diwakili. Benar, tetapi tidak ada yang namanya "memori tak terbatas" jadi ini adalah poin yang bisa diperdebatkan. Yang lain menyatakan bahwa Excel dapat menggunakan representasi internal yang lebih besar, misalnya 128 bit. Benar, tetapi, ternyata komputer lebih baik dalam melakukan operasi matematika pada angka yang diwakili dengan jumlah bit yang sesuai dengan ukuran bus prosesor. Jadi komputer 32 bit akan tercepat pada operasi matematika pada angka 32 bit dan komputer 64 bit akan tercepat pada operasi matematika pada angka 64 bit. Jika dan ketika akan ada komputer 128 bit, maka kita dapat mengharapkan Excel untuk pindah ke representasi angka 128 bit. Itu masih akan memberikan satu set angka yang sangat besar tetapi terbatas yang dapat diwakili.
Jika kekhawatiran Anda adalah tentang bagaimana angka-angka terlihat di spreadsheet, maka menggunakan presisi set (jumlah desimal) akan memberi Anda hasil yang konsisten. Jika Anda prihatin tentang perbedaan antara nomor yang Anda ketikkan dan nomor aktual yang disimpan oleh Excel, Anda berhak khawatir. Perbedaannya nyata dan kesalahan akan dilakukan melalui perhitungan yang Anda lakukan. Saya khawatir Anda terjebak dengan kesalahan ini. Ini adalah batasan Excel, bukan bug seperti yang dinyatakan beberapa orang. Kemungkinan tidak akan berubah dalam waktu dekat, jadi jika tidak dapat diterima untuk Anda, saya sarankan Anda mencari aplikasi spreadsheet lain yang dapat mewakili angka dengan presisi lebih tinggi. Tetapi perlu diingat bahwa jika Anda menemukan aplikasi seperti itu, batasannya masih ada. Hanya saja ukuran kesalahannya berbeda.
sumber