- ベストアンサー
小数点のみの数値をかけると0になる問題の対処方法とは?
- 小数点のみの数値をかけると0になってしまいます。parseIntで文字列を数列に変換していることから起きる問題のようですが、どのように対処すれば小数点の計算も問題なくなり、出来れば小数点第二位くらいで四捨五入できるようになるのでしょうか?
- 参考サイトには Math.trunc(x) を使うと良いと記載されていますが、Android 4.4 では対応していないため、今のところ使えないようです。
- この問題に対する適切な解決方法はまだ見つかっていないようです。アンドロイド4.4以前のバージョンでも正確な計算ができる方法を探す必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> ただこの浮動小数というものは計算違いが出るようですが、小数点3以内で四捨五入してやればそのような問題は起きないと考えてよいでしょうか? 浮動小数の演算は必ず誤差が発生します。 IEEE 754 の規定に準じた誤差なので防ぎようがありません。 小数点以下3桁でも計算したら誤差が生じるので、誤差が許容できないのであれば数値を小数の無い整数にして扱うしかありません。 > roundNum = roundNum * 1000; 実はこの計算も誤差が発生します。 私が作っていたシステムでも小数点以下3桁の値を入力させて、それを千倍して整数にして処理をしようとしましたが、入力値は小数点以下3桁しか入れてなくても特定の値では千倍しても整数になりませんでした。 いろいろ調べましたが仕様なので数値を千倍では誤差を回避できないので、入力値を文字列として扱い、小数点の前後で文字列を分割し元々の整数部をparseIntしてから千倍し、小数部を3桁の文字列として左から3文字分切り取り(足りなければ右にゼロを足し)parseIntで整数にして元々の整数部を千倍した値に足すと言う方法で回避し、表示する時は整数を文字列化してから分割し間にピリオドを足して文字列として表示するようにしました。 同じ会社の他の人にも聞きましたが、これが誤差を出さないための一般的な考え方のようです。
その他の回答 (4)
- pringlez
- ベストアンサー率36% (598/1630)
parseInt:parseIntは文字通り、整数型に変換する関数なので、0.8は0になります。小数を扱いたいときに使うべきではありません。 単に文字列を数値にしたいだけなら var str = "0.8"; var n = str - 0; とでもすればいいでしょう。 計算結果を最後に、小数点第二位で四捨五入した表現の文字列にしたいのであれば var result = n.toFixed(2); でOKです。
- amanojaku1
- ベストアンサー率54% (265/488)
JavaScriptにおける数値⇔文字列の型変換あれこれ http://lealog.hateblo.jp/entry/2013/02/28/005010 > parseFloat(str); ↑こちらが浮動小数点用です。
- kteds
- ベストアンサー率42% (1882/4440)
掛ける数値を10倍して計算結果を10で割ればいいのでは? 計算結果は少数以下を反映させるようにしておけばいいでしょう。
- t_ohta
- ベストアンサー率38% (5238/13705)
parseInt は「整数」に変換するので 0.8 は 0 になります。 parseFloat を使って「浮動小数」に変換しましょう。
お礼
ありがとうございます、確かにできました。 ただこの浮動小数というものは計算違いが出るようですが、小数点3以内で四捨五入してやればそのような問題は起きないと考えてよいでしょうか? 四捨五入は function round() { roundNum = roundNum * 1000; roundNum = Math.round(roundNum) / 1000; } というようにすればよいようですが、同じ処理を何とも書きたくないので関数化したところ関数スコープで、中身を参照できずに小数点3位で四捨五入が出来ません。 どうすればよいかご存知でしたら教えていただければ幸いです。
お礼
ありがとうございます。小数点を使う限りどうしてもござが出てしまうのですね。 最後の大変な方法以外は、それなら小数点は1位までにするなしにするなどして減らすしかないですね。