質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

1回答

702閲覧

2つで1つの価格計算を実装したい

tillandsia

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

0クリップ

投稿2020/07/09 14:47

問題

商品があるとして、2つ商品を購入すれば、1つ分の値段で販売という割引を実現したいのですが、つまづいています。

商品の値段が、1つ200円だとして、3つ購入した場合、

javascript

1Math.floor(yen * item / 2 + yen * item % 2);// ← 演算子の組み合わせがよくわからない 2// 10が正解だが、8になる

上記のように考えましたが、計算結果はうまく反映されません。(小数点は四捨五入)
ヒントをいただければ幸いです。

利用環境

  • Chrome: Version 83.0.4103.116
  • ES6
  • OS: Mac OS, Catalina

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

計算式は、単価×(個数の半分(整数位未満切り捨て)+ 個数を2で割った余り)で良いでしょう。

質問の式だと、yen * item / 2個数の半分(整数位未満切り捨て)の切り捨て部分を考慮できていません。

// 10が正解だが、8になる

え、400が正解では?

追記

もう一つ、剰余の計算部分yen * item % 2は、*%の優先順位が等価なため、単価×数量の計算結果を2で割った余りになってしまって期待通りの結果になりません。

演算子の優先順位がよくわからないなら、1行で書かずに計算結果を1つ一つ変数に入れてみましょう。

投稿2020/07/09 15:19

編集2020/07/09 22:54
hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tillandsia

2020/07/09 15:41

hope_mucciさん、 迅速な回答ありがとうございます。 あ、元の問題が商品1つにつき5ドルだったので、その時のコメントアウトが残ってました。 ご指摘ありがとうございます。 「質問の式だと、yen * item / 2が 個数の半分(整数位未満切り捨て)の切り捨て部分を考慮できていません。」 すみません、どうしたら切り捨て部分を考慮すれば良いか教えていただけますか...? この部分をどう表現したら良いのかで悩んでいます。
hope_mucci

2020/07/09 22:56

どちらが分かりませんか? ・切り捨てする方法 ・切り捨てする意味
tillandsia

2020/07/09 23:56

切り捨てする方法が、自分で試してみた結果よくわかりませんでした。 切り捨てはMath.floor()で実現できているかと思ったのですが、全体の計算結果にかかっていて、個数の半分にかかっていないということでしょうか? let remainder = item % 2; let division = item / 2; yen = Math.floor(yen * (division + remainder)); 上記になるかなとも思ったのですが、これも思うような結果が得られません。 コンソールに 200 * (3 % 2) + 200 * (3 % 2) と書いた場合、3つ商品を購入した場合は思うような結果が得られますが、5つ購入した場合も400円になってしまい、これも計算が合いません...
hope_mucci

2020/07/10 01:46

個数だけにMath.floorをかければ良いです。 item = 3; let division = Math.floor(item / 2); //<- 1になる
tillandsia

2020/07/10 14:47

教えていただいた通り、Math.floorが全体にかかっていて、肝心の個数にだけかけるということができていなかったようです。 無事解決しました! let yen = 200; let item = 3; let division = Math.floor(item / 2); let remainder = item % 2; yen = yen * (division + remainder); 非常に勉強になりました。 わからなければ、1つずつ変数に入れるという方法、今後も参考にさせていただきます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問