---
html: currency-formats.html
parent: basic-data-types.html
blurb: 通貨番号の精度と範囲、カスタム通貨コードのフォーマットです。
labels:
  - XRP
  - トークン
---
# 通貨フォーマット

XRP Ledgerには2種類の通貨（[XRP](xrp.html)と[発行済み通貨](issued-currencies.html)）があります。XRP Ledgerでは、これらの通貨のフォーマットは異なりますが、いずれの通貨も高精度です。

## 文字列フォーマット

{% include '_snippets/string-number-formatting.md' %}
<!--{#_ #}-->

## XRPの精度

XRPの精度は、64ビット符号なし整数と同等であり、各単位は0.000001 XRPと同等です。プロパティは次の通りです。

* 最小値: `0`
* 最大値: `100000000000`（10<sup>11</sup>）XRP
    - `"100000000000000000"`（10<sup>17</sup>） dropのXRP
* `0.000001`（10<sup>-6</sup>）XRPに近い精度
    - `"1"` dropのXRP

## 発行済み通貨の精度

XRP Ledgerの発行済み通貨は、以下の精度のカスタムフォーマットで表現されます。

* 非ゼロの最小絶対値: `1000000000000000e-96`
* 最大値: `9999999999999999e80`
* 最小値: `-9999999999999999e80`
* 10進15桁の精度

## 発行済み通貨の計算
[[ソース]](https://github.com/ripple/rippled/blob/35fa20a110e3d43ffc1e9e664fc9017b6f2747ae/src/ripple/protocol/impl/STAmount.cpp "Source")

![発行済み通貨額フォーマットの図](img/currency-number-format.ja.png)

`rippled`内部では発行済み通貨の数値はカスタムの数値フォーマットで表現されます。このフォーマットではさまざまな資産（一般的にごく小さな単位または極めて大きな単位で測定される資産を含む）を保管できます。このフォーマットでは、有効数字と10のべき乗の指数を科学的記数法と同様の方法で使用します。このフォーマットは、指定された範囲内のプラスまたはマイナスの有効桁数と指数に対応しています。非整数値の一般的な浮動小数点表記とは異なり、このフォーマットでは整数を用いて計算します。このため、常に15桁の精度が維持されます。乗算と除算には、最下位の有効数字の丸め過ぎを補う調整機能があります。

「任意精度」の数値フォーマットとは異なり、カスタムフォーマットは64ビットの固定サイズで格納できます。このようにシリアル化される場合、このフォーマットは「非XRP」ビット、符号ビット、有効桁数、指数で構成されます。これらは次の順で表示されます。

1. 発行済み通貨額の1番目のビット（最上位ビット）は、XRPの額ではないことを示す`1`です。（XRPの額である場合、最上位ビットは常に`0`に設定され、このフォーマットからXRPの額が区別されます。）
2. 符号ビットは、金額のプラスマイナスを示します。標準的な[2の補数で表される](https://en.wikipedia.org/wiki/Two%27s_complement)整数とは異なり、`1` はXRP Ledgerフォーマットでは**プラス**を示し`0`はマイナスを示します。
3. 次の8ビットは、指数を符号なし整数で表しています。指数は、小数点以下桁数（有効桁数に乗算する10のべき乗）を-96以上+80以下の範囲で示します。ただしシリアル化では、この指数に97を加算して符号なし整数としてシリアル化できるようにします。したがってシリアル化された値が`1`の場合は指数`-96`、シリアル化された値が`177`の場合は指数80を示します。
4. 残りの54ビットは、有効数字を符号なし整数で表します。シリアル化では、値0の特殊なケースを除き、この値は10<sup>15</sup>（`1000000000000000`）以上10<sup>16</sup>-1（`9999999999999999`）以下の範囲で正規化されます。値0の特殊なケースがあります。この場合符号ビット、指数、および仮数はすべてゼロであるため、64ビット値は`0x8000000000000000000000000000000000000000`としてシリアル化されます。


## 通貨コード

XRP LedgerのXRP以外の通貨には160ビットの通貨コードがあります。[`rippled`API](http-websocket-apis.html)では、標準マッピングを使用して3文字のASCII文字列（大文字と小文字の区別あり）が160ビットの通貨コードにマッピングされます。通貨コード`XRP`は発行済み通貨には使用できません。同一コードの通貨は接続トラストラインを通じて[ripple](rippling.html)できます。通貨コードには、XRP Ledgerに組み込まれるその他の動作はありません。

### 標準通貨コード

標準通貨マッピングによりビットが次のように割り当てられます。

![標準通貨コードのフォーマット](img/currency-code-format.ja.png)

1. 最初の8ビットは`0x00`でなければなりません。
2. 次の88ビットは予約済みであり、すべて`0`です。
3. 次の24ビットは3つのASCII文字を表します。
    [ISO 4217](https://www.xe.com/iso4217.php)コードまたはよく利用されている疑似ISO 4217コード（BTCなど）の使用が推奨されます。ただし、すべての大文字と小文字、桁数、および記号`?`、`!`、`@`、`#`、`$`、`%`、`^`、`&`、`*`、`<`、`>`、`(`、`)`、`{`、`}`、`[`、`]`、および<code>|</code>の組み合わせを使用できます。通貨コード`XRP`（すべて大文字）はXRP用に予約されており、発行済み通貨には使用できません。
4. 次の40ビットは予約済みであり、すべて`0`です。

通常、XRP額の指定時には通貨コードは使用しません。フィールドにXRPの通貨コードが指定されている稀なケースでは、通貨コードのバイナリ形式はすべてゼロになります。

### 非標準通貨コード

通貨コードとして160ビット（40文字）16進文字列（例: `015841551A748AD2C1F76FF6ECB0CCCD00000000`）を使用して、その他のタイプの通貨を発行することもできます。異なる通貨コードタイプとして扱われないようにするには、先頭8ビットが`0x00`であってはなりません。

**廃止予定:** 一部の旧バージョンの[ripple-lib](https://github.com/XRPLF/xrpl.js)では通貨コードタイプとして「有利子」または「マイナス利子」がサポートされていました。これらの通貨の先頭8ビットは`0x01`です。マイナス利子/有利子通貨はサポートされなくなりましたが、レジャーデータにこのような通貨が現れることがあります。詳しくは、[マイナス利子](demurrage.html)を参照してください。
