Solidity
BigDecimals 的不正確乘積
我的solidity函式發出一個uint256為:5060584000000000000000000的事件
問題出在我的 javascript 測試中的松露方面。這是程式碼:
const { BN, expectEvent, constants } = require('@openzeppelin/test-helpers'); const amount = new BN('100); const price = new BN('5060584000'); const decimalsA = new BN ('5'); const decimalsB = new BN ('18'); const baseTen = new BN('10'); var totalValue = amount * price; totalValue = totalValue * (baseTen ** (decimalsB - decimalsA));
totalValue var在javascript 測試中總是錯誤地返回 5060584000000000291504128 但事件正確地給了我 5060584000000000000000000。
這當然會導致我的測試失敗。我究竟做錯了什麼?(假設具有大數字精度的東西?)
似乎對此的修復類似於這篇文章:https ://forum.openzeppelin.com/t/erc20-decimals-specifying-a-big-number/2047/4
我需要使用大數字庫乘法和冪函式來進行計算,因為數字對於 JavaScript 來說太大了。該測試現在正在使用:
const { BN, expectEvent, constants } = require('@openzeppelin/test-helpers'); const amount = new BN('100); const price = new BN('5060584000'); const decimalsA = new BN ('5'); const decimalsB = new BN ('18'); const baseTen = new BN('10'); var totalValue = amount.mul(price); totalValue = totalValue.mul(baseTen.pow(decimalsB.sub(decimalsA);