Solidity

BigDecimals 的不正確乘積

  • May 6, 2021

我的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); 

引用自:https://ethereum.stackexchange.com/questions/98400