javascriptでのbitcoinの数値(satoshi)の扱い方
ビットコインの単位のおさらい
最小単位は1satoshiである
それを基準に表す
unit | btc | satoshi |
---|---|---|
BTC | 1 | 100,000,000 |
mBTC | 0.001 | 100,000 |
uBTC(bits) | 0.000001 | 100 |
satoshi | 0.00000001 | 1 |
BTCで扱うと浮動小数点で誤差が出ます。
オカネの扱いで誤差がでるとまずいです。
誤差がでないように固定小数点(Decimal型)かsatoshiで扱います
javascriptの数値型の扱い(satoshi)
浮動小数点型で整数としてなら以下の範囲を表現出来ます
- -9,007,199,254,740,992 ~ 9,007,199,254,740,992 (約9007兆)
つまりsatoshiとして扱う場合、約9000万を超えると表現範囲を超えるということになります。
(ビットコインは2100万枚なので十分でしょう)
この値を超えて扱うと判断した場合にはbignumber.jsなどを使います
(monacoinは1億512万枚だけど一度に扱わなければ問題ない気もする。)
satoshiにする方法
value * 1e8でsasoshiとなりますが浮動小数点の誤差がでるので四捨五入します
例えば以下の数値は端数が出ます
0.31111111*1e8=31111111.000000004
Math.round(0.31111111*1e8) = 31111111
satoshiから戻す方法
satoshi * 1e-8で戻せますが例のごとく誤差が出ます。
四捨五入で対処します
99999999 * 1e-8=0.9999999900000001
(99999999 * 1e-8).toFixed(8)='0.99999999'
parseFloat((99999999 * 1e-8).toFixed(8))=0.99999999
satoshiの演算方法
普通にnumber型に対しての演算とあまり変わりませんが丸め処理だけはMath.roundなどの関数が使えないので桁を戻したりして対応します。