gpt4 book ai didi

c++ - System::Currency 和 C++ Builder

转载 作者:行者123 更新时间:2023-11-28 05:10:34 28 4
gpt4 key购买 nike

我正在使用 Embarcadero C++ Builder XE10 构建一个执行一些货币计算的应用程序。

在尝试使用 System::Currency 数据类型时,我遇到了几个问题。

Q1:为什么使用“%”运算符计算模数会失败?

System::Currency TaxValue = 1.665;
System::Currency Rest = 0;

// Correct result: Rest will be 0.005 when converted to double
Rest = TaxValue - ( TaxValue / 100 * 100 );

// Incorrect result: Rest is the same as TaxValue
Rest = TaxValue % 100;

Edit: I have been totally fooled by the debugger's output where the System::Currency's value is shown in its integer represention multiplied by 10.000.

What I really expected to see was:

Rest = (TaxValue * 10000) % 100;

==> Now Rest is 50, which is exactly what I expected.

问题 2:如何使用 Curreny 数据类型进行正确的银行四舍五入?

例子:

1.664 => 1.66
1.665 => 1.67
1.666 => 1.67

赫维格

最佳答案

Q1: Why does the calculation of the modulus fail when using the "%" operator?

System::Currency以 4 位小数的精度进行运算。您的示例需要 2 位数的精度。

System::Currency通过在内部将输入值乘以 10000 来保持其精度而不会出现舍入误差然后使用整数数学而不是 float 学来操纵值。

当你初始化TaxValue1.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;}

第一部分创建一个临时文件 Currency使用 int 初始化的对象(16650 % (10000 * 100)) = 16650 的值, 它乘以 10000166500000通过临时对象的构造函数:

__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;}

Q2: How can I do a correct banker's rounding with the Curreny data type?

看看 System::Round()函数,它使用银行家舍入。

如果您想更好地控制舍入,请使用 System::Math::RoundTo()函数,或查找第 3 方舍入函数。

StackOverflow 上还有其他几个与 Currency 相关的问题四舍五入,例如:

How to get Delphi Currency Type to Round like Excel all the time?

rounding a currency

(System::Currency 是 C++Builder 对 Delphi 原生 Currency 类型的包装)。

关于c++ - System::Currency 和 C++ Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43591903/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com