assembly/composables/useMath.ts

67 lines
1.9 KiB
TypeScript
Raw Normal View History

2021-08-16 19:22:40 +00:00
import { useBigNumber } from './useBigNumber'
const { pow, div, toBN, lt, isZero } = useBigNumber()
export function useMath() {
// Convert bigNumber in string (use to save us from big number error on web3)
// TODO - start using big number library for it?
function bigNumInString(x) {
if (Math.abs(x) < 1.0) {
const e = parseInt(x.toString().split('e-')[1])
if (e) {
x *= Math.pow(10, e - 1)
x = '0.' + new Array(e).join('0') + x.toString().substring(2)
}
} else {
let e = parseInt(x.toString().split('+')[1])
if (e > 20) {
e -= 20
x /= Math.pow(10, e)
x += new Array(e + 1).join('0')
}
}
return x
}
// Use to convert large decimal into small. Eg:- number 321.242312 with power 3 = 321.242
function cleanDecimal(num, power) {
let MUL_DIV = 100
if (power || power === 0) {
MUL_DIV = 10 ** power
} else {
if (num < 0.01) MUL_DIV = 10 ** 6
if (num < 1) MUL_DIV = 10 ** 4
}
return Math.floor(Number(num) * MUL_DIV) / MUL_DIV
}
function roundDecimals(value) {
if (isZero(value)) return 0.0
if (lt(value, '0.001')) return cleanDecimal(toBN(value).toNumber(), 6)
if (lt(value, '0.01')) return cleanDecimal(toBN(value).toNumber(), 5)
if (lt(value, '0.1')) return cleanDecimal(toBN(value).toNumber(), 4)
if (lt(value, '1')) return cleanDecimal(toBN(value).toNumber(), 3)
return cleanDecimal(toBN(value).toNumber(), 3)
}
function divWithDec(num, power) {
power = typeof power !== 'undefined' ? power : 0
const divider = pow('10', power)
return div(num, divider).toFixed()
}
/**
* Checks divisor for 0. Returns 0 instead of NaN.
*
* @param {number} divident Divident.
* @param {number} divisor Divisor.
*/
function safeDivide(divident, divisor) {
if (!divisor) return 0
return divident / divisor
}
return { bigNumInString, divWithDec, cleanDecimal, safeDivide, roundDecimals }
}