Q1: Mengapa penghitungan modulus gagal saat menggunakan operator "%"?
System::Currency
beroperasi dengan presisi 4 tempat desimal. Contoh Anda mengharapkan presisi 2 digit.
System::Currency
mempertahankan presisinya tanpa kesalahan pembulatan dengan mengalikan nilai masukan secara internal dengan 10000
lalu menggunakan matematika bilangan bulat alih-alih matematika titik-mengambang untuk memanipulasi nilai.
Saat Anda menginisialisasi TaxValue
dengan 1.665
, anggota Val
internalnya (yang merupakan __int64
) disetel ke (1.665 * 10000) = 16650
. Berikut tampilan konstruktornya:
__fastcall Currency(double val) {Val = _roundToInt64(10000 * val);}
Saat Anda menjalankan TaxValue % 100
, operator %
diimplementasikan seperti ini:
Currency __fastcall operator %(int rhs) const
{return Currency(static_cast<int>(Val % (10000 * (__int64)rhs))) / 10000;}
Bagian pertama membuat objek temp Currency
yang diinisialisasi dengan nilai int
sebesar (16650 % (10000 * 100)) = 16650
, yang dikalikan dengan 10000
hingga 166500000
oleh konstruktor objek temp:
__fastcall Currency(int val) {Val = 10000*(__int64)val;}
Bagian kedua kemudian membagi suhu dengan 10000
. Operator /
diimplementasikan seperti ini:
Currency& __fastcall operator /=(const Currency& rhs)
{Val *= 10000; Val /= rhs.Val; return *this;}
Currency __fastcall operator /(int rhs) const
{Currency tmp(*this); return tmp /= Currency(rhs);}
Sehingga menghasilkan objek Currency
akhir yang Val
-nya telah disetel ke (166500000 * 10000) / (10000 * 10000) = 16650
.
Ketika Currency
akhir tersebut kemudian ditetapkan ke Rest
dan dikonversi ke double
, nilainya dibagi dengan 10000
, sehingga menghasilkan 1.665
:
__fastcall operator double() const {return ((double)Val) / 10000;}
Q2: Bagaimana cara melakukan pembulatan bankir yang benar dengan tipe data Curreny?
Lihat fungsi System::Round()
yang menggunakan pembulatan bankir.
Jika Anda ingin lebih mengontrol pembulatan, gunakan fungsi System::Math::RoundTo()
, atau cari fungsi pembulatan pihak ketiga.
Ada beberapa pertanyaan lain di StackOverflow yang berhubungan dengan pembulatan Currency
, misalnya:
Bagaimana cara membuat Jenis Mata Uang Delphi selalu Bulat seperti Excel?
pembulatan mata uang
(System::Currency
adalah pembungkus C++Builder untuk tipe Currency
asli Delphi).
person
Remy Lebeau
schedule
25.04.2017
System::Currency
bukan bagian dari standar C++. Apakah Anda kebetulan mengkompilasi sebagai C++/CLI dan bukan C++? - person Algirdas Preidžius   schedule 24.04.2017