Mengapa Google Spreadsheets mengatakan Zero tidak sama dengan Zero?


8

Setelah menghabiskan berjam-jam mencoba mencari kesalahan dalam spreadsheet akuntansi pribadi saya, saya bisa menyematkannya ke satu formula.

Sementara ini menghasilkan Nol

=((0,6-0,3-0,4)+(-0,3+0,8-0,4))

membandingkannya dengan Zero memberi saya salah

=((0,6-0,3-0,4)+(-0,3+0,8-0,4))=0

Apa yang saya lewatkan?


2
Pernahkah Anda mengalami kegembiraan matematika floating point?
— ale

1
Ya saya lakukan (dengan cara yang lebih buruk) dengan Javascript. Tapi bukankah perhitungan matematika Google Spreeadsheets terjadi di sisi server?
— Bruno

Mungkin. Saya khawatir saya tidak punya jawaban untuk Anda. Saya baru saja menemukan sedikit lucu bahwa ini adalah domain lain di mana 0 != 0.
— ale

1
Mungkin Anda dapat memeriksa apakah jumlahnya kurang dari atau sama dengan jumlah terkecil.
— aparente001

"Setelah menghabiskan berjam-jam mencoba mencari kesalahan dalam spreadsheet akuntansi pribadi saya" - suka itu: D senang saya bukan satu-satunya orang yang membuang waktu dengan cara ini;)
— Baris

Jawaban:


6

Berkat keajaiban aritmatika titik apung ,

((0.6-0.3-0.4)+(-0.3+0.8-0.4))

mengevaluasi sekitar -5.55e-17 dalam presisi ganda. Ini berlaku dalam JavaScript dan juga di Google Spreadsheets. Tidak masalah apakah perhitungannya adalah sisi klien atau sisi server: yang penting adalah format angka yang digunakan. Tampaknya Google Sheets menggunakan presisi ganda .

Solusinya sama: hindari perbandingan kesetaraan untuk angka floating point. Dalam kasus Anda, mengubah unit dengan mengalikan semuanya dengan 10 akan menghindari masalah.


1
Saya menyebutkan "sisi server" karena Google dapat menggunakan tipe angka desimal presisi desimal yang sewenang-wenang dari bahasa pemrograman favorit mereka di dalam server mereka.
— Bruno

Ada platform yang menggunakan desimal daripada titik mengambang biner: HP48S. Saya mengetahui bahwa angka desimal sebenarnya disimpan dalam paket 4 bit, jadi a tetapi sia-sia karena tidak semua kombinasi dari 4 bit digunakan. Saya ingat bahwa saya bereksperimen dengan mengubah memori secara langsung dan bahkan membuat angka lebih dari 9.
— Heimdall

Solusi saya adalah =FLOOR(B3+C2, 0.01)untuk bekerja dengan mata uang
— NonlinearFruit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.