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?

bruno
sumber
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.

Komunitas
sumber
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