Skip to main content

lightning-record-edit-formで数値(18,0)の桁数超過が検知されず保存される問題 

 

レコード新規作成・編集用のLWCを作成しています。 

lightning-record-edit-formを使用し、form.submit(fields)で保存しています。 

項目はlightning-input-fieldを使用しています。 

 

数値項目(例:数値(18,0))に対して18桁を超える非常に大きい値を入力した場合、 

通常は以下のようなシステムエラーが表示されます。 

「項目名 : 数値項目で有効な範囲を逸脱した値: 数値 1E+42 は大きすぎます。18 桁、小数点以下第 0 位以下の値を入力してください。 」 

 

しかし、特定のパターンの場合のみ、エラーにならず、そのまま保存されてしまいます。 

保存後の値は入力値とは異なる値に変換されています。 

例: 

入力値:100000000000000000000079 → 保存される値:200376420520689000 

入力値:1000000000000000000000000000000000000000000079 → 保存される値:802379605485813000 

 

標準のレコード作成ではこのような動作は発生しません。 

 

LWC + lightning-record-edit-form を使用する場合、 

標準画面と同様に桁数を制御する方法はありますでしょうか。 

原因や解決方法をご存知でしたら教えていただけますと幸いです。  

 

#Salesforce  #LWC

1 comment
  1. Mar 26, 2:24 PM

    lightning-record-edit-form を利用した際、非常に大きな数値(特に18桁を超えるもの)がバリデーションをすり抜けて「全く別の値」で保存されてしまう現象ですね。

    ​これは、JavaScript の Number 型の精度限界(IEEE 754 浮動小数点数) が原因である可能性が非常に高いです。

    ​1. 原因:JavaScript の「2進数変換」と精度の限界

    ​JavaScript の Number 型で安全に扱える整数の最大値(Number.MAX_SAFE_INTEGER)は 2^{53} - 1、つまり 9,007,199,254,740,991(16桁) です。

    ​ご提示の「18桁を超える入力値」を JavaScript(LWCの内部処理)が数値として扱おうとした際、以下の挙動が発生します。

    1.​精度の欠落: 安全な範囲を超えた数値は、最も近い近似値に丸められます。

    2.​オーバーフロー: 内部的な submit() 処理の過程で、巨大な数値が 64ビット浮動小数点数として処理され、Salesforce のサーバーに送られる前に値が「壊れて」しまいます。

    3.​バリデーションの回避: lightning-input-field は、サーバーへ送る直前の値をチェックしますが、既に JavaScript 側で(意図しない)範囲内の数値に変換されてしまっている場合、サーバー側では「正常な数値」として受け取ってしまい、保存が成功してしまいます。

0/9000