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

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

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

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

Q&A

解決済

4回答

617閲覧

【PHP】浮動小数点型の判定をしたい

pegy

総合スコア243

PHP

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

0グッド

0クリップ

投稿2017/11/06 02:19

編集2017/11/06 02:27

お世話になります。
下記のように$aと$bの変数があります。
ここでユーサーが要求する計算により、その結果の$aや$bが
割られた結果(浮動小数点型?)であれば小数第2位表示、
そうでなければ、整数表示にしたいと考えております。

そこで、小数点があるかに着目して
if (strpos($aa,".")) {
$result=number_format($aa,2);
}else{
$result=number_format($aa);
}
と考えたのですが1)のケースのように割られているのに小数点が出ないケースがあるのでだめでした。

他に
if (is_float($aa)) {
$result=number_format($aa,2);
}else{
$result=number_format($aa);
}
のように浮動小数点として判定する方法でも全てが
trueになります。

目的としては除算した結果であれば小数点表示させたいのです。
しかしながら100/10のように整数が帰ってくるような除算では判定できません。
もちろん除算を含む否かの時点で識別することは可能ですが、計算結果やその型から
判定することは可能でしょうか?
宜しくお願い申し上げます。

php

1$a=int(4559200000) ; 2$b=int(5984313200); 3 41) $aa= $a/1000; 5var_dump($aa); 6//4559200 → 4,559,200.00と表示したい 72) $aa= $b/1000; 8var_dump($bb); 9//5984313.2 →5,984,313.20と表示したい 10 113) $aa= $a+10; 12var_dump($aa); 13//4,559,200,010 →小数表示したくない 144) $bb= $b+10 15var_dump($bb); 16//5,984,313,210 →小数表示したくない

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

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

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

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

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

guest

回答4

0

ベストアンサー

「必ず浮動小数点型で結果を返す除算を行う」関数myDivを作って、
除算はmyDivを利用、他の四則演算は通常の演算子を利用する
ではいかがでしょう?

function myDiv($a, $b){ $result = $a / $b; return number_format((float)$result, 2); }

投稿2017/11/06 02:55

gyarasu

総合スコア148

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

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

pegy

2017/11/06 03:49

コメント有難うございます。 なるほど、非常にシンプルですが、目的を達成できそうです。 聞いてよかったです^^
guest

0

PHPの場合、整数同士の割り算は、「結果が整数になるならint、そうでなければfloat」という挙動を示しますので(リファレンス)、結果だけ見て割り算をした後の値なのか判定することは、整数については無理です。

なお、PHP、そもそも整数型のないJavaScript以外の多くの言語では、「整数 / 整数」の結果は整数として返ってきますので、要注意です。

投稿2017/11/06 02:26

maisumakun

総合スコア145183

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

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

pegy

2017/11/06 02:41

maisumakun様 コメント有難うございます。 以下の部分ですね。マニュアルを確認いたしました。やはり難しいですか。。 他の方法で分岐を考えています。 “除算演算子 ("/") の返す値は浮動小数点数となります。 ただし、ふたつのオペランドがともに整数 (あるいは整数に変換できる文字列) であり、かつ結果が割り切れる場合には整数値を返します。”
maisumakun

2017/11/06 02:44

計算経過まで必要なら、もはやそれはたんなる数値型でやることではなくて、自分でクラスを立てて計算状況も管理させる、という方がいいかと思います。
pegy

2017/11/06 02:53

コメント有難うございます。 なるほど、なかなか単純にはいきませんね。 エクセル的な間隔で1000/10は常に100.0のように計算させるような過程を踏めば、とも思ったのですが、あれも型の問題ではなく表示上のお話ですしね。。
guest

0

$a を 100 倍したものを基準にして、最終的に 100 で割り切れるかを確認するって方法もアリかと。

php

1<?php 2$as = [5,10,15,100,120,125,130,140]; 3$b = 3; 4 5foreach ($as as $a) { 6 $tmp_1 = $a * 100; 7 $res_1 = $tmp_1 / $b; 8 if ($res_1 % 100 === 0){ 9 $res_2 = $res_1 / 100; 10 } else { 11 $res_2 = number_format($res_1 / 100,2); 12 } 13 echo $a . ':' . $res_2 . PHP_EOL; 14} 15

php

15:1.67 210:3.33 315:5 4100:33.33 5120:40 6125:41.67 7130:43.33 8140:46.67

まぁ、上がちょっと狭くなっちゃいますけどw

投稿2017/11/06 04:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pegy

2017/11/06 08:51

コメント有難うございます! なるほど、こういう柔軟な発想がいつもすごいなと思います。とても納得感がありました。 早速採用させて頂きます。
guest

0

質問に対する回答ではありませんが、剰余を使うことは検討されましたか?
入力が浮動小数点の場合はfmodがありますが、精度の問題で割り切れるケースの判定は要注意ですが、元の要求が小数点以下2桁までなので剰余が0.01以下なら割り切れたとしてよさそうです。

投稿2017/11/06 02:57

nullbot

総合スコア910

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

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

pegy

2017/11/06 03:47

コメント有難うございます。割り切れてしまう場合、例えば1000/10ですが、でもtrueとしたいので、剰余は使えないと思ったのですが、fmodについて、確認をしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問