在Transfer模块中,汇率(exchange_rate)表示"1个外部币能兑换多少内部币"。
汇率 = 内部币数量 / 外部币数量
外部金额 = 内部金额 ÷ 汇率
内部金额 = 外部金额 × 汇率
假设汇率为1.0450,表示1个外部币可以兑换1.0450个内部币。
假设汇率为0.9568,表示1个外部币可以兑换0.9568个内部币。
// 计算金额(转出:内部金额转换为外部金额)
$amount = (string) $data['amount']; // 内部金额
$outAmount = bcdiv($amount, (string) $app->exchange_rate, 10); // 外部金额 = 内部金额 ÷ 汇率
// 计算金额(转入:外部金额转换为内部金额)
$outAmount = (string) $data['amount']; // 外部金额
$amount = bcmul($outAmount, (string) $app->exchange_rate, 10); // 内部金额 = 外部金额 × 汇率
// 将三方金额转换为农场内部金额(充值:外部金额转内部金额)
$internalAmount = bcmul($amount, (string) $transferApp->exchange_rate, 10);
// 将三方金额转换为农场内部金额(提现:外部金额转内部金额)
$internalAmount = bcmul($amount, (string) $transferApp->exchange_rate, 10);
`exchange_rate` decimal(10,4) NOT NULL DEFAULT '1.0000' COMMENT '汇率(1个外部币能兑换多少内部币)'
`exchange_rate` decimal(10,4) NOT NULL COMMENT '使用汇率(1外部币=N内部币)'
public function testExchangeRateConversion()
{
// 设置汇率为2.0(1外部币=2内部币)
$app = TransferApp::factory()->create(['exchange_rate' => 2.0]);
// 测试转出:100内部币应该转换为50外部币
$outOrder = TransferLogic::createOutOrder($app, ['amount' => '100.00']);
$this->assertEquals('50.0000000000', $outOrder->out_amount);
// 测试转入:100外部币应该转换为200内部币
$inOrder = TransferLogic::createInOrder($app, ['amount' => '100.00']);
$this->assertEquals('200.0000000000', $inOrder->amount);
}
认为汇率表示"1个内部币能兑换多少外部币",导致:
外部金额 = 内部金额 × 汇率(错误)内部金额 = 外部金额 ÷ 汇率(错误)汇率表示"1个外部币能兑换多少内部币",因此:
外部金额 = 内部金额 ÷ 汇率(正确)内部金额 = 外部金额 × 汇率(正确)Transfer模块的汇率概念明确定义为"1个外部币能兑换多少内部币",这个定义:
所有相关代码已经按照这个概念进行了修正和注释,确保实现的一致性和正确性。