プロが教える店舗&オフィスのセキュリティ対策術

あなたの得意な言語、知っている言語で答えてください

あるプログラミングの問題で
小数点代3位で「四捨五入」しなさいという問題があったとします
あなたならどのように記述しますか?

質問者からの補足コメント

  • なんだか程度の低い回答ばかりでがっかりでした
    正直、君らが語る程度の能書きなんてどうでも良いんだわ

    小学生程度でも理解できる、質問の意味すら理解できない人まで登場する始末

      補足日時:2021/08/18 08:04

A 回答 (4件)

こーゆー事?


地上最強のプログラミング言語、ANSI Common Lisp。

CL-USER> (/ (round (* 123.456789 1000)) 1000.0)
123.457
CL-USER>

ただし、本音を言うとLisp系言語では一般に、

> 小数点第3位で「四捨五入」しなさいという問題があったとします

ありません。
何故なら、発想が「プログラミング言語は小数しか扱えない」って前提の問題だから、ですよね。
Lisp系言語では一般に、分数が扱えて、これはフツーの言語じゃ扱えないケースが多いですね(Rubyや、最近やっとPythonでも扱えたりするみたいですが<- ただしメンドかった気がする)。

CL-USER> (/ 1 3)
1/3
CL-USER>

だから「分数で正しい数値を扱える」Lisp系言語だと、丸めがどーの、って意識する必要がないんですよ。いつでも分数が扱える。勝手に約分してくれる。常に(有理数範疇では)「誤差が無い」正確な数値を扱える。
要するにめったに四捨五入をする必要がないですし、結局、出力時に「どう出力するのか」だけ考えればいいだけなんで、誰もそんな「小数点第3位で四捨五入する」とか言うお題とか考えもしないのです。

写真: (Emacsに)インストールしたらスライムだった件(謎
「あなたの得意な言語、知っている言語で」の回答画像4
    • good
    • 0
この回答へのお礼

>ありません。
何故なら、発想が「プログラミング言語は小数しか扱えない」って前提の問題だから、ですよね

誰もそんなこと言ってない
質問も理解できない人の回答に意味がないことにすら理解できない人なんですね

お礼日時:2021/08/18 07:58

decimal.Decimal#quantizeで '0.01',ROUND_HALF_UP を指定。


pythonです。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2021/08/18 08:02

プログラミング言語というより、コンピュータが提供する数値計算機能の知識が大事です。



数値計算には、整数化と浮動小数点化(実数化)というものがあります。
前者では、浮動小数点(実数)の小数部を切り捨てる操作です。
これをうまく使うと、質問者がやりたいことができます。

『小数点第3位で四捨五入』なら、

まず、四捨五入する『桁』を『1の位』になるようにします。
それは、その数に 1,000 を掛けます。

そこで数を整数化します。
これで『小数点第4位以下を切り捨てます。』

そのうえで、1,000 を掛けて得た数の『1の位』に5を足します。
これで、『1の位』が5以上ならば上の桁が1増え、そうでなければ(4以下なら)上の方は変わりません。
これが『1の位』を『四捨五入』する操作です。

『小数点第3位』に対する操作は終わりました。
『小数点第3位で四捨五入』とは、『小数点第2位』までが答えですから、『小数点第3位』はもう捨てていいわけです。
なので、整数演算で数を10で割ります。
これで『小数点第3位』は切り捨てられました。

これで数は『小数点第2位』が『1の位』になっています。
最後に10で割った時に、『1の位』が『小数点第3位』から『小数点第2位』に変わったということです。

そこで、この数を浮動小数点(実数)に変え、もとの位取りになるように 100 で割ります。

以上が、質問者のやりたいことを実施するプロセスです。
以下はそれをプログラム化したものです。


int i, j, k
real a, b, c, d

a = 123.456789

b = a*1000.0
i = int(b)
j = i+5
k = j/10
c = float(k)
d=c/100.0

特に言語は意識して書いていません。
Fortran や Basic ならこのまま実行できるでしょう。
    • good
    • 0
この回答へのお礼

能書きはどうでもいいわ
あなたが語ってる能書き程度の事は理解しての質問だ

お礼日時:2021/08/18 07:58

こんばんは。



Excel VBAで。

Sub test()
 Dim SplNum as Double

SplNum = 0.123456
Msgbox Round(SplNum, 3)
Exit sub

手入力なので、記入ミスがあるかも知れませんが。

因みに、これは何の問題でしょうか?
    • good
    • 0
この回答へのお礼

Excelを所有していないので検証はできないのですが
回答ありがとうございました

>これは何の問題でしょうか?

それは後ほど答えたいと思います

お礼日時:2021/08/17 22:10

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