「
数値型の計算誤差
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
==一度整数にした後で変換する== 他には、例えば一度整数にしてから計算する方法も考えられます。次の例では、二つの数を整数にすることができる数<code>dis ** 10</code>を求めて二数を整数にした後、計算を行うことで誤差を防ぎます。ただしこの場合でも、有効数字15桁以上の数は正確に扱うことができません。 import “Alice.Math”; ///与えられた数の小数点以下の桁数を取得します function GetDisitsUnder1(number num) { var priceString = price.ToString().TrimEnd('0'); int index = priceString.IndexOf('.'); if (index == -1){return 0;} return priceString.Substring(index + 1).Length; } ///二つの小数が等しいかどうかを判断します function NumEqual(number numA,numbner numB) { //numA,numBの小数点以下の桁数(すなわち、10の何乗倍すれば整数になるか) var nAd = GetDisitsUnder1(numA); var nBd = GetDisitsUnder1(numB); //二つの小数の小数点以下桁数のうち多い方 var dis = math_max(nAd,nBd); //numA,numBを整数化したもの var rA = numA * (dis ** 10); var rB = numB * (dis ** 10); return (rA == rB); } ///二つの小数の和を求めます function Sum(number numA,number numB) { //numA,numBの小数点以下の桁数(すなわち、10の何乗倍すれば整数になるか) var nAd = GetDisitsUnder1(numA); var nBd = GetDisitsUnder1(numB); //二つの小数の小数点以下桁数のうち多い方 var dis = math_max(nAd,nBd); //numA,numBを整数化したもの var rA = numA * (dis ** 10); var rB = numB * (dis ** 10); //整数化されたものの計算結果 var result = rA + rB; return (result / (dis ** 10)); } print(NumEqual(0.1+0.2,0.3));//出力例:true print(Sum(0.1,0.2));//出力例:0.3
編集内容の要約:
AliceScript Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
AliceScript Wiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
案内
メインページ
ツアー
ダウンロード
規約
おまかせ表示
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報