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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3035閲覧

PHPで計算結果を小数点以下まで表示したい

sharpnail

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/09 00:55

編集2019/07/09 01:30
$percentage = $bunsi/$bunbo;

この$bunsi/$bunboの結果を小数点以下2桁まで表示しようと思っているのですが、$bunbo/$bunsiの結果が整数にならない場合でも、出力結果が整数に直されてしまいます。(というのはphpのデフォルト仕様のようですが…)

そこで方法を調べ

$percentage = sprintf('%.2f',100-$bunsi/$bunbo)

としたのですが、これだとどんな結果でも小数点以下は.00になってしまいます。
100-$bunbo/$bunsiの時点で既に整数に直されてしまってるからだと思いますが、

100-sprintf('%.2f',$bunbo/$bunsi) sprintf('%.2f',100-sprintf('%.2f',$bunsi/$bunbo))

等を試しても、1つ目は整数表示(最初と同じ)、2つ目はまたまたどんな結果でも.00になってしまいます…

上手く最初のコードの時点で小数点以下を表示できないでしょうか。

補足:$bunsiと$bunboの値にはgmp_fact($x)のようなgmpを利用した値を代入しています(xはユーザーにより入力)

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

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

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

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

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

m.ts10806

2019/07/09 00:59

細かいですが $bunbo/$bunsi; 分母と分子、変数名とするなら逆では?
sharpnail

2019/07/09 01:24

あっ…ボケてました。すみません
m.ts10806

2019/07/09 01:25

質問は編集できますので適宜調整してください。
sharpnail

2019/07/09 01:27

はい。問題の本質部にも答えて頂けると嬉しいです
guest

回答3

0

ベストアンサー

$bunbo/$bunsiの結果が整数にならない場合でも、出力結果が整数に直されてしまいます。(というのはphpのデフォルト仕様のようですが…)

いえ、PHPではそうはならないはずです。

除算演算子 ("/") の返す値は浮動小数点数となります。 ただし、ふたつのオペランドがともに整数 (あるいは整数に変換できる文字列) であり、かつ結果が割り切れる場合には整数値を返します。(PHPマニュアルより)

(GMP数の場合、演算をしてもGMP数、すなわち整数の範囲内となります。詳細はコメントの方に書きました)

投稿2019/07/09 00:59

編集2019/07/09 01:52
maisumakun

総合スコア145183

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

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

maisumakun

2019/07/09 01:38 編集

GMPですと整数範囲でしか計算されませんので、分子を100倍してから割り算をかけて整数の範囲で出して、gmp_intvalでふつうの整数に戻してから100.0で割って小数に持ち込む、というような流れになるかと思います。
maisumakun

2019/07/09 01:40

巨大な数が必要なのではなく、GMPの演算を使いたいだけなら、$a = gmp_intval(gmp_fact(5));のように、計算直後にintに戻すのも一案です。
maisumakun

2019/07/09 01:49

intに収まらない巨大数を小数点以下2桁で表現したい場合は、100倍したものをそのままgmp_strvalで文字列化してから、最後2文字の手前に小数点を追加する、という文字列的な処理を行うという手法も考えられます。
sharpnail

2019/07/09 02:46 編集

質問前の大本のコードは $bunsi=gmp_fact($a)*gmp_fact($b)*100; $bunbo=gmp_fact($c)*gmp_fact($d); $percentage=100-$bunsi/$bunbo; といったコードでした。(分子と分母は修正済) 質問時に一般化しようと単純なコードにしすぎてしまいましたが、そのまま書くべきでした。 教えていただいたgmp_intvalを用いて $temp=gmp_intval($bunsi*100/$bunbo)/100.0; という変数を作り $percentage=100-round($temp,2); として解決いたしました。 ($bunsiと$bunbo内のgmp_fact($a)~gmp_fact($d)それぞれを直接gmp_intvalで囲うと、仰るような巨大な数になってしまうのに該当する?エラーが起こってしまいました。) gmp_intvalを用いてgmp同士の割り算を整数に戻していなかったのが全ての原因だったという事でしょうか。 ここまでご教授頂きありがとうございました。
guest

0

こういうことでしょうか。

php

1$percentage = $bunsi/$bunbo; 2 3echo round($percentage,2); 4

投稿2019/07/09 01:01

m.ts10806

総合スコア80850

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

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

sharpnail

2019/07/09 01:31

$percentageおよび$bunsi/$bunboの段階で既に整数になってしまっている?ようでroundを用いても小数点以下は表示されません。
m.ts10806

2019/07/09 01:38

具体的な数値をあげられたほうが良いかと。 そもそもround()なしにした場合でも、「整数に丸められる」という現象が私の方では確認できていません。 $bunsi = 9; $bunbo = 29; //そのまま: 0.31034482758621 //round: 0.31 $bunsi = 19; $bunbo = 29; //そのまま: 0.6551724137931 //round: 0.66 $bunsi = 9; $bunbo = 299; //そのまま: 0.030100334448161 //round: 0.03 $bunsi = 299; $bunbo = 9; //そのまま: 33.222222222222 //round: 33.22
m.ts10806

2019/07/09 01:51

なるほど。gmpですか。結構大事な情報ですね(できれば環境関係に関わるので最初から書いておいてもらいたい情報ですね・・)
sharpnail

2019/07/09 01:55

申し訳ありません。 先程bunbo,bunsiと同じ方の回答と確認せず、本質にも回答して頂きたい等と言ってしまったのと重ねてお詫びいたします。
m.ts10806

2019/07/09 01:58 編集

いえいえ。タイミング諸々で被ってしまうこともありますしね。 前提条件が分かればまた検証できるので。 とはいってもmaisumakunさんの回答でおおよそ進みそうに思います。 一応、参考程度にはとどめておいてください。
guest

0

本質は算数の問題だと思うよ。。。

php

1<?php 2$bunsi = 1; 3$bunbo = 2; 4 5echo $bunsi/$bunbo; 6echo PHP_EOL; 7$percentage = sprintf('%.2f',100-$bunsi/$bunbo); 8echo $percentage; 9echo PHP_EOL; 10//0.5 11//99.50 12 13echo $bunsi*100/$bunbo; 14echo PHP_EOL; 15$percentage = sprintf('%.2f',100-$bunsi*100/$bunbo); 16echo $percentage; 17echo PHP_EOL; 18//50 19//50.00 20 21$bunsi = 1; 22$bunbo = 3; 23echo $bunsi*100/$bunbo; 24echo PHP_EOL; 25$percentage = sprintf('%.2f',100-$bunsi*100/$bunbo); 26echo $percentage; 27//33.333333333333 28//66.67

投稿2019/07/09 01:35

編集2019/07/09 01:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sharpnail

2019/07/09 01:42

小数点以下が表示されない原因はbunsiとbunboが逆だからじゃないんですが何で本質が算数の問題になるんですかね?
退会済みユーザー

退会済みユーザー

2019/07/09 01:44

検証見るとわかるけど、小数点以下が表示されています。 整数になるような計算してるんでしょ。
maisumakun

2019/07/09 01:45

GMP数による演算、と追記された後の回答ですので、マイナスさせていただきました。
退会済みユーザー

退会済みユーザー

2019/07/09 02:18

あーGMPかぁw 質問修正前のモノを前提にして回答しました。 1/2 のつもりで 2/1 やってそうな雰囲気だったので。 まぁ、式自体は算数な修正が必要かと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問