คำถามที่ 1: เหตุใดการคำนวณโมดูลัสจึงล้มเหลวเมื่อใช้ตัวดำเนินการ "%"
System::Currency
ทำงานด้วยความแม่นยำระดับทศนิยม 4 ตำแหน่ง ตัวอย่างของคุณคาดหวังความแม่นยำ 2 หลักแทน
System::Currency
รักษาความแม่นยำโดยไม่มีข้อผิดพลาดในการปัดเศษโดยการคูณค่าอินพุตภายในด้วย 10000
จากนั้นใช้คณิตศาสตร์จำนวนเต็มแทนคณิตศาสตร์จุดลอยตัวเพื่อจัดการค่า
เมื่อคุณเริ่มต้น TaxValue
ด้วย 1.665
สมาชิก Val
ภายใน (ซึ่งก็คือ __int64
) จะถูกตั้งค่าเป็น (1.665 * 10000) = 16650
นี่คือลักษณะของตัวสร้างนั้น:
__fastcall Currency(double val) {Val = _roundToInt64(10000 * val);}
เมื่อคุณดำเนินการ TaxValue % 100
แล้ว ตัวดำเนินการ %
จะถูกนำไปใช้ดังนี้:
Currency __fastcall operator %(int rhs) const
{return Currency(static_cast<int>(Val % (10000 * (__int64)rhs))) / 10000;}
ส่วนแรกสร้างวัตถุ temp Currency
ที่เริ่มต้นด้วยค่า int
ของ (16650 % (10000 * 100)) = 16650
ซึ่งจะถูกคูณด้วย 10000
ถึง 166500000
โดยตัวสร้างของวัตถุ temp:
__fastcall Currency(int val) {Val = 10000*(__int64)val;}
ส่วนที่สองจะแบ่งอุณหภูมิด้วย 10000
ตัวดำเนินการ /
ถูกนำไปใช้ดังนี้:
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);}
ดังนั้นการสร้างอ็อบเจ็กต์ Currency
สุดท้ายซึ่งตั้งค่า Val
เป็น (166500000 * 10000) / (10000 * 10000) = 16650
เมื่อ Currency
สุดท้ายนั้นถูกกำหนดให้เป็น Rest
และแปลงเป็น double
ค่าจะถูกหารด้วย 10000
ดังนั้นจึงได้ 1.665
:
__fastcall operator double() const {return ((double)Val) / 10000;}
คำถามที่ 2: ฉันจะทำการปัดเศษของนายธนาคารที่ถูกต้องด้วยประเภทข้อมูลสกุลเงินได้อย่างไร
ดูที่ฟังก์ชัน System::Round()
ซึ่งใช้การปัดเศษของนายธนาคาร
หากคุณต้องการควบคุมการปัดเศษมากขึ้น ให้ใช้ฟังก์ชัน System::Math::RoundTo()
หรือค้นหาฟังก์ชันการปัดเศษของบุคคลที่สาม
มีคำถามอื่นๆ อีกหลายข้อเกี่ยวกับ StackOverflow ที่เกี่ยวข้องกับการปัดเศษ Currency
เช่น:
จะทำให้ประเภทสกุลเงิน Delphi ปัดเศษเหมือน Excel ตลอดเวลาได้อย่างไร
การปัดเศษสกุลเงิน
(System::Currency
เป็น wrapper ของ C++ Builder สำหรับประเภท Currency
ดั้งเดิมของ Delphi)
person
Remy Lebeau
schedule
25.04.2017
System::Currency
ไม่ได้เป็นส่วนหนึ่งของ C++ มาตรฐาน คุณมีโอกาสรวบรวมเป็น C++/CLI แทนที่จะเป็น C++ หรือไม่? - person Algirdas Preidžius   schedule 24.04.2017