とっておきの「夜食」教えて下さい

実数 Y を小数点第n位で
(1)切り上げ
(2)切り捨て
をしたいのですが、どのようにすれば良いのでしょうか

A 回答 (8件)

#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
となります。
どちらを選択するかは、好みによります。
    • good
    • 0

 #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
    • good
    • 0

実数 Y を小数点第n位以下で(第n位を有効にする)


と解釈していいでしょうか

1) int(Y*10^n+0.9)/10^n

2) int(Y*10^n)/10^n

となります
    • good
    • 0

すみません、#3の者です。


#3のロジック、微妙に間違ってました。
以下に訂正します。

(1)Yに10のn-1乗を掛ける。
(2)その結果に対して、切り上げの場合0.9を加え、切り捨ての場合何もしない。
(3)その結果を整数で切り捨てる(Int, Fix関数)。
(4)その結果を10のn-1乗で割る(元の桁数に戻す)。

小数点にして切り捨てないと切り捨てられませんでしたね。
考え方は後に解答されている#4さんと同じ考え方です(というより#4さんを見て間違いに気がつきました)。
    • good
    • 0

(1) int(Y*10^(n-1)+0.9)/10^(n-1)


(2) int(Y*10^(n-1))/10^(n-1)
    • good
    • 2

以下のロジックで対応できます。



(1)Yに10のn乗を掛ける。
(2)その結果に対して、切り上げの場合9を加え、切り捨ての場合何もしない。
(3)その結果を整数で切り捨てる(Int, Fix関数)。
(4)その結果を10のn乗で割る(元の桁数に戻す)。

#ちなみに、Round関数はあくまでも丸め(疑似四捨五入=厳密には四捨五入ではないが四捨五入に近い丸め)であり、切り上げ・切り捨てではありません。
上記の考え方で、(2)で5を加えれば厳密な四捨五入もできます(Round関数のような丸めではなく)。
    • good
    • 0

#1です。


すみません四捨五入と勘違いしていました。

切り上げはROUNDUP
切捨てはROUNDDOWN

になります。
    • good
    • 0

ROUND関数を使えば可能です。



ROUND(Y,n)でいいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報