問題タブ [rounding-error]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHP の丸めの問題
四捨五入の問題が発生しています.3つの慈善団体のデータベースがあり、金額が異なります..次に、3つの慈善団体が割り当てられた金額に基づいてパーセンテージを表示しており、合計パーセンテージは常に100%になる必要があります. . 現在、各慈善団体に 1 が割り当てられている場合、それぞれに 33% が表示されます。これは 99% に相当しますが、常に 100% になるようにごまかす必要があります..
ここにPHPがあります
私はこれに対する数学の解決策を見つけました..しかし..私の数学はそれほど素晴らしいものではありません..しかし..正直なところ、私はこれを完全には理解していません:
どんな助けでも大歓迎..
excel - VBAを使用して小数点以下2桁に丸めます
入力した情報を月別 (列) と人別 (行) で合計するプログラムを作成していますが、四捨五入の問題が発生しています。範囲に名前を付けて、その範囲内のセルをフォーマットして小数点以下2桁に丸めることができる他の場所を見てきましたが、私はVBAが初めてで、答えが書かれた疑似コードは私を助けるのに十分ではありませんでした.
以下は、私の問題に合った回答へのリンクですが、疑似コードの実装に問題があります。
rotation - クォータニオン インスタント数値ドリフト
ユーザーのマウス入力から作成された小さな変更でクォータニオンを伝播しています。ここでは、X 軸で追加された回転用のクォータニオンと Y 軸用のクォータニオンを作成し、これらの回転を 1 つのクォータニオンに結合します。これらの変更をカメラのクォータニオンに追加 (追加) し続け、グリンバルロックのないカメラを作成しました (これはまだ狂ったように回転しています :S)
カメラの回転を開始した瞬間、回転行列が拡大縮小し始め、制御不能になります。フレームごとにカメラのクォータニオンを正規化するとすべてが正常に機能しますが、すべてのフレームを正規化する必要はありませんよね? これが数値のずれだとすれば、すぐには見えないのではないでしょうか?
この質問では:四元数と正規化
David Hammen は次のコメントを投稿しました。
正規化は、クォータニオンをユニット 3 球体にドラッグして戻すための手間です。四元数が多様体からずれてしまう理由は、そのオイラー ステップが数学的にある意味で無効だからです。単位四元数は群であり、代数ではありません。単位四元数を使用しないことも無効です。これで、so(3) にチャートがなくなりました。それを正しく行うと (たとえば、リー群の積分法)、四元数はほとんど多様体にとどまります。時々正規化する必要があるかもしれません
オイラー回転から 2 つのクォータニオンを作成しているため、これが劇的な回転エラーの原因である可能性がありますか?
オイラー回転から生成されたクォータニオンは、使用前に常に正規化する必要がありますか?
decimal - Excel 2003 で、
結果が 200 を超える場合は小数を表示しないように「if」関数を配置し、小数を 1 つ表示しない場合はそれを指定します。結果の小数が .0 でない限り、うまく機能し、小数は表示されません。小数を強制的に表示するにはどうすればよいですか? これが私の関数です: =IF($E$13>200,ROUND($E$13,0),ROUND($E$13,1))
javascript - Javascript の丸めの失敗
これは、使用している丸め関数です (丸め方に関するスタックオーバーフローの回答から取得されます)。半分を 2 dp に切り上げます (デフォルト)。
たとえば、2.185 は 2.19 に移動する必要があります
うまく機能しましたが、いくつかのエラーが見つかりました (Chrome と IIS 7.5 で jscript クラシック ASP として実行中の両方で)。
例えば:
誰か知っていますか:
- なぜこれが起こるのか。
- このようなランダムな丸め誤差なしで、半分を 2 dp に丸める方法。
更新: OK、問題の核心は、js では 625.185 * 100 = 62518.499999 であり、どうすればこれを乗り越えることができるでしょうか?
javascript - JavaScript の丸め誤差のテスト
JavaScript で数値が大きすぎる (計算を実行すると丸め誤差が発生する) かどうかを判断するにはどうすればよいですか。
たとえば、パーセンテージをフォーマットする関数があります。渡された値を正しくフォーマットできない場合は、渡されたとおりの値を返すようにします。
このような巨大な数値をフォーマットすることはまれなケースであり、予期されていないため、渡された数値をそのまま返すことをお勧めします。丸めエラーが発生する前の制限と、それらを確認するにはどうすればよいですか?
アップデート:
Number が精度を失うことなく到達できる JavaScript の最大の整数値は? 精度は +/- 9007199254740992 まで機能します。安全に失敗し、渡された値を変更せずに返すためにチェックする必要があるのはそれだけかどうかをテストしています。
matlab - Matlab:数値のゼロ以外の最後の桁の位置を見つける
pp
たとえば、数値で満たされた列ベクトルがあります。
ベクトル内の最小のゼロ以外の数字が占める小数点の右側の桁数を見つけたいと思います。この場合は6
に4
なり3.123734
ます。次に、ベクトル内のすべての数値を 10^6 で乗算して、ベクトル内のすべての小数を取り除きます。丸め誤差をなくすためにこれを行いたいです。これを行うための最良の方法は何ですか?
c# - decimal を double にキャストするときの奇妙な動作
decimal を double にキャストするときに奇妙な問題が発生しています。
次のコードは true を返します。
ただし、これを double にキャストすると、false が返されます。
Math.Pow を使用したいときにこの問題が発生し、10 進数の Math.Pow オーバーロードがないため、10 進数を double にキャストする必要がありました。
これは文書化された動作ですか? decimal を double にキャストする必要がある場合、どうすれば回避できますか?
Visual Studio のスクリーンショット:
Math.Round をキャストして、次の結果を 2 倍にします。
アップデート
わかりました、私は次のように問題を再現しています:
- WPF アプリケーションを実行し、開始直後にウォッチで出力を確認すると、空のプロジェクトのように true になります。
- スライダーから計算アルゴリズムに値を送るアプリケーションの一部があります。間違った結果が得られ、計算方法にブレークポイントを設定しました。ここで、ウォッチ ウィンドウで値を確認すると、false になります (何も変更せずに、ウォッチ ウィンドウを更新するだけです)。
- いくつかの小さなプロジェクトで問題を再現したらすぐに、ここに投稿します。
更新2
残念ながら、小規模なプロジェクトで問題を再現することはできません。エリックの答えがその理由を説明していると思います。
fortran - fortranでダブルアップ/ダウンを高速に切り上げますか?
Fortranで切り上げ/切り下げを行う高速な方法はありますか?
正の倍精度数のビット表現の線形順序により、以下のように丸めを実装できます。
pinf
およびninf
は、それぞれ +/- 無限大であるグローバル定数です
遅いので最善の方法ではないと思いますが、ほとんどビット操作しか使用しません。
別の方法は、乗算といくつかのイプシロンを使用することです
eps = epsilon (1d0)
両方の関数が同じ結果を返すものx
(1d0、158d0) もあれば、そうでないもの (0.1d0、15d0) もあります。
最初の関数はより正確ですが、2 番目の関数よりも約 3.6 倍遅いです (10^9 ラウンドのテストで 11.1 秒対 3.0 秒)。
NaN/Infinities のチェックがない場合、最初の関数のテストに 8.5 秒かかります (-20%)。
私はラウンド関数を非常によく使用し、プログラムのプロファイルに多くの時間がかかります。精度を落とさずに高速に丸めるクロスプラットフォームの方法はありますか?
アップデート
質問は、それらを並べ替えることができない時点でのラウンドアップとラウンドダウンの呼び出しを疑っています。トピックを短くするために、丸めについては言及しませんでした。
ヒント: 最初の関数は 2 つのtransfer
関数と 1 つの加算を使用します。また、2 番目のケースでは、1 つの乗算と 1 つの加算よりも低速です。数値のビットで何もしないのに、なぜ転送コストがそんなにかかるのですか? より高速な関数で転送を置き換えるか、追加呼び出しをまったく回避することは可能ですか?