- 締切済み
小数点 第n位 を切り上げ,切り捨て
実数 Y を小数点第n位で (1)切り上げ (2)切り捨て をしたいのですが、どのようにすれば良いのでしょうか
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- ginyou
- ベストアンサー率32% (138/431)
#6です #7の説明はちょつと間違っていたので訂正します 切り捨てについて補足説明をします。 小数点以下2桁目を切りすてる場合 切り捨てとは何かという事になります 10.51=10.5 -10.51=-10.5 である。 とします、実は INTの場合 言語仕様によっては、 -10.51=-10.5となるINTもあります VB6は-10.51=-10.6と確認しました 負の場合、切り捨てと言うのは-10.51=-10.6とします。 つまり、0より下にする事が切り下げという考えです。 -10.51=-10.5 このようにするには、以下のように、正と負を分けて計算する必要があります If Y < -1 Then Y2 = Abs(Y) Y3 = Int(Y2 * 10 ) / 10 else Y3 = Int(Y * 10 ) / 10 End If では、切り上げはというと If Y < -1 Then Y2 = Abs(Y) Y3 = Int(Y2 * 10 + .09 ) / 10 else Y3 = Int(Y * 10 + 0.9) / 10 End If とします。 切り上げの場合注意しなければいけないのは Y3 = Int(Y2 * 10 + .09 ) / 10 この計算式では、負の時おかしくなるという事です -10.51+.09=-10.42-->-10.5 -10.59+.09=-10.5-->-10.6 となります。 つまり負の時は-.09を付けなければいけないという事です。 つまり、単独でする場合、負の場合 Y3 = Int(Y2 * 10 - .09 ) / 10 となります。 どちらを選択するかは、好みによります。
- ginyou
- ベストアンサー率32% (138/431)
#6です 切り上げについて補足説明をします。 小数点以下2桁目を切り上げる場合 切り上げとは何かという事になります 10.51=10.6 -10.51=-10.6 である。 とします、実はVBのINTは伝統的に 負の場合、切り上げと言うのは-10.51=-10.5とします。 つまり、0に近づける事が切り上げという考えです。 Fortran言語はINTは -10.51=-10.6 となります このようにするには、以下のように、正と負を分けて計算する必要があります If Y < -1 Then Y2 = Abs(Y) Y3 = Int(Y2 * 10 + 0.9) / 10 else Y3 = Int(Y * 10 + 0.9) / 10 End If
- ginyou
- ベストアンサー率32% (138/431)
実数 Y を小数点第n位以下で(第n位を有効にする) と解釈していいでしょうか 1) int(Y*10^n+0.9)/10^n 2) int(Y*10^n)/10^n となります
- mfuku
- ベストアンサー率50% (173/345)
すみません、#3の者です。 #3のロジック、微妙に間違ってました。 以下に訂正します。 (1)Yに10のn-1乗を掛ける。 (2)その結果に対して、切り上げの場合0.9を加え、切り捨ての場合何もしない。 (3)その結果を整数で切り捨てる(Int, Fix関数)。 (4)その結果を10のn-1乗で割る(元の桁数に戻す)。 小数点にして切り捨てないと切り捨てられませんでしたね。 考え方は後に解答されている#4さんと同じ考え方です(というより#4さんを見て間違いに気がつきました)。
- vantage
- ベストアンサー率60% (310/514)
(1) int(Y*10^(n-1)+0.9)/10^(n-1) (2) int(Y*10^(n-1))/10^(n-1)
- mfuku
- ベストアンサー率50% (173/345)
以下のロジックで対応できます。 (1)Yに10のn乗を掛ける。 (2)その結果に対して、切り上げの場合9を加え、切り捨ての場合何もしない。 (3)その結果を整数で切り捨てる(Int, Fix関数)。 (4)その結果を10のn乗で割る(元の桁数に戻す)。 #ちなみに、Round関数はあくまでも丸め(疑似四捨五入=厳密には四捨五入ではないが四捨五入に近い丸め)であり、切り上げ・切り捨てではありません。 上記の考え方で、(2)で5を加えれば厳密な四捨五入もできます(Round関数のような丸めではなく)。
- nek
- ベストアンサー率34% (46/135)
#1です。 すみません四捨五入と勘違いしていました。 切り上げはROUNDUP 切捨てはROUNDDOWN になります。
- nek
- ベストアンサー率34% (46/135)
ROUND関数を使えば可能です。 ROUND(Y,n)でいいと思います。