小数点のみの数値をかけると0になる問題の対処方法とは?

このQ&Aのポイント
  • 小数点のみの数値をかけると0になってしまいます。parseIntで文字列を数列に変換していることから起きる問題のようですが、どのように対処すれば小数点の計算も問題なくなり、出来れば小数点第二位くらいで四捨五入できるようになるのでしょうか?
  • 参考サイトには Math.trunc(x) を使うと良いと記載されていますが、Android 4.4 では対応していないため、今のところ使えないようです。
  • この問題に対する適切な解決方法はまだ見つかっていないようです。アンドロイド4.4以前のバージョンでも正確な計算ができる方法を探す必要があります。
回答を見る
  • ベストアンサー

0.8など小数点のみの数値をかけると0になる

0.8など小数点のみの数値をかけると0になってしまいます。 parseIntで文字列を数列に変換していることから起きる問題のようですがどのように対処すれば小数点の計算も問題なくなり、 出来れば小数点第二位くらいで四捨五入できるようになるのでしょうか? 下記を使うと良いと参考サイトにあったのですが、アンドロイド4.4でも対応していないようなので当面使えないですよね。 Math.trunc(x) で整数にする https://gist.github.com/Hamayama/a1ddbd882cb06a475735 機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile 基本サポート 未サポート 未サポート 25.0 (25) 未サポート 未サポート iOS 8

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5086/13294)
回答No.4

> ただこの浮動小数というものは計算違いが出るようですが、小数点3以内で四捨五入してやればそのような問題は起きないと考えてよいでしょうか? 浮動小数の演算は必ず誤差が発生します。 IEEE 754 の規定に準じた誤差なので防ぎようがありません。 小数点以下3桁でも計算したら誤差が生じるので、誤差が許容できないのであれば数値を小数の無い整数にして扱うしかありません。 > roundNum = roundNum * 1000; 実はこの計算も誤差が発生します。 私が作っていたシステムでも小数点以下3桁の値を入力させて、それを千倍して整数にして処理をしようとしましたが、入力値は小数点以下3桁しか入れてなくても特定の値では千倍しても整数になりませんでした。 いろいろ調べましたが仕様なので数値を千倍では誤差を回避できないので、入力値を文字列として扱い、小数点の前後で文字列を分割し元々の整数部をparseIntしてから千倍し、小数部を3桁の文字列として左から3文字分切り取り(足りなければ右にゼロを足し)parseIntで整数にして元々の整数部を千倍した値に足すと言う方法で回避し、表示する時は整数を文字列化してから分割し間にピリオドを足して文字列として表示するようにしました。 同じ会社の他の人にも聞きましたが、これが誤差を出さないための一般的な考え方のようです。

okweb12345
質問者

お礼

ありがとうございます。小数点を使う限りどうしてもござが出てしまうのですね。 最後の大変な方法以外は、それなら小数点は1位までにするなしにするなどして減らすしかないですね。

その他の回答 (4)

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.5

parseInt:parseIntは文字通り、整数型に変換する関数なので、0.8は0になります。小数を扱いたいときに使うべきではありません。 単に文字列を数値にしたいだけなら var str = "0.8"; var n = str - 0; とでもすればいいでしょう。 計算結果を最後に、小数点第二位で四捨五入した表現の文字列にしたいのであれば var result = n.toFixed(2); でOKです。

回答No.3

JavaScriptにおける数値⇔文字列の型変換あれこれ http://lealog.hateblo.jp/entry/2013/02/28/005010 > parseFloat(str); ↑こちらが浮動小数点用です。

  • kteds
  • ベストアンサー率42% (1876/4424)
回答No.2

掛ける数値を10倍して計算結果を10で割ればいいのでは? 計算結果は少数以下を反映させるようにしておけばいいでしょう。

  • t_ohta
  • ベストアンサー率38% (5086/13294)
回答No.1

parseInt は「整数」に変換するので 0.8 は 0 になります。 parseFloat を使って「浮動小数」に変換しましょう。

okweb12345
質問者

お礼

ありがとうございます、確かにできました。 ただこの浮動小数というものは計算違いが出るようですが、小数点3以内で四捨五入してやればそのような問題は起きないと考えてよいでしょうか? 四捨五入は function round() { roundNum = roundNum * 1000; roundNum = Math.round(roundNum) / 1000; } というようにすればよいようですが、同じ処理を何とも書きたくないので関数化したところ関数スコープで、中身を参照できずに小数点3位で四捨五入が出来ません。 どうすればよいかご存知でしたら教えていただければ幸いです。

関連するQ&A

  • Javaの小数点について

    Q = Integer.parseInt(args[0]); A = Q % 5; if ( A == 0 ) { System.out.print( ( Q + 2 ) / 3 ); } 5の倍数の場合は、 入力された値に2を足した値を3で割った値 を表示したい ( 表示するのは小数点第2位までで、小数点第3位を四捨五入したい) というプログラムなのですが小数点の出し方が解りません。 どうやればよいのでしょうか? 「D:\Work>java test 5  演算結果は 2.33 です」 上記のように表示させたいのですがよくわかりません。 申し訳ないですが教えてください。

    • ベストアンサー
    • Java
  • 小数点の四捨五入で分からないことがあります

    例えば、0.230978という値を小数点第4位を四捨五入したら、答えは0.231ですか?それとも0.2310が答えですか? また、0.8という値を小数点第1位を四捨五入したら、答えは1.0ですか?それとも1ですか? よろしくお願いします。

  • エクセルの小数点を消す

    とある割合をかけて算出する計算式の答えが、小数点以下8ケタくらいの数字になりました。 ROUNDとかの関数を使えば、四捨五入されるのは知っていたのですが、それを忘れてしまったため、全ての答えに小数点以下の数字が入ってしまいました。 答えから、小数点以下を消したい(できれば四捨五入して)のですが、1コ1コ消していくのしかないのでしょうか??

  • エクセルで小数点第二位を四捨五入せず・・・

    エクセルで小数点第二位を四捨五入せずに、小数点第一位まで表示さるにはどうすればよいでしょうか。 207004×12%-24840=0.48 なんですが、0.4まで表示したいのです。 でも第一位までしか表示しないと、第二位が四捨五入されて、0.5になってしまうんですよね。 簡単な方法を教えてください。

  • エクセルで小数点を無視して数値化する

    エクセルで小数点を無視して数値化する方法を教えて下さい。 例 0.1285 を 1285   111.245 を 111245 と切り捨て、四捨五入ではなく数値のみを切り取りたいのですが 簡単な方法ないでしょうか?

  • javascriptで小数点以下2捨3入の記述方法は?

     javascriptで小数点以下四捨五入(Math.round)切り上(Math.ceil) 切下げ(Math.floor)はありますが、事情があって2捨3入、3捨4入が 必要となりました。どこで調べても見つかりません。どなたか記述方法 を教えてください。 また小数点以下第1位、第2位を特定できる方法もありましたら あわせて教えていただければ幸いです。

  • エクセルで小数点以下3桁を四捨五入して、小数点以下1桁を表示する方法

    エクセル2003を使用しています。 計算式から出た結果に対して、小数点以下3桁を四捨五入して、小数点以下2桁ではなく、1桁を表示したいです。 例えば、計算式の結果、 1.145 の場合、普通に四捨五入すると 小数点以下1桁なら、1.1 小数点以下2桁なら、1.15 となってしまいます。 これを小数点以下3桁を四捨五入して、小数点以下1桁表示の1.2と表示させたいのですが、可能でしょうか?

  • エクセルで、小数点第2位を四捨五入するには

    毎度 お世話になります。 A1に、2.26 と数字が入力されると・・ A2に、自動で、2.3 と、小数点第二位を四捨五入 してくるにはどうすればいいですか? よろしくおねがいします。

  • AVERAGE関数では、小数点以下を切り上げてますよね。

    範囲指定した12個の数値を、AVERAGE関数で平均を出したら、小数点以下を切り上げて(四捨五入?)しまいました。 =AVERAGE(A1:A12) を小数点以下を切り捨てるにはどのように記述すれば良いのでしょうか。 教えてください。

  • 小数点の切り上げ方(?_?)

    仕事中なのですが・・・。3時までに仕上げなくてはいけなくて困っています! エクセルで表計算で数字を入力しています。 小数点以下を四捨五入するのですが、切上げ方が分からず・・・確か「セルの書式設定」からどうにかすればよかったような・・・ すみませーん!誰か教えて下さい!