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

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

ただいまの
回答率

90.99%

  • PHP

    17798questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 222

pegy

score 54

お世話になります。
下記のように$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のように整数が帰ってくるような除算では判定できません。
もちろん除算を含む否かの時点で識別することは可能ですが、計算結果やその型から
判定することは可能でしょうか?
宜しくお願い申し上げます。

$a=int(4559200000) ;
$b=int(5984313200);

1) $aa= $a/1000;
var_dump($aa);
//4559200 → 4,559,200.00と表示したい
2) $aa= $b/1000;
var_dump($bb);
//5984313.2 →5,984,313.20と表示したい

3) $aa= $a+10;
var_dump($aa);
//4,559,200,010 →小数表示したくない
4) $bb= $b+10
var_dump($bb);
//5,984,313,210 →小数表示したくない
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/06 12:49

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/06 11:41

    maisumakun様
    コメント有難うございます。
    以下の部分ですね。マニュアルを確認いたしました。やはり難しいですか。。
    他の方法で分岐を考えています。

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

    キャンセル

  • 2017/11/06 11:44

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

    キャンセル

  • 2017/11/06 11:53

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/06 12:47

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

    キャンセル

0

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

<?php
$as = [5,10,15,100,120,125,130,140];
$b = 3;

foreach ($as as $a) {
    $tmp_1 = $a * 100;
    $res_1 = $tmp_1 / $b;
    if ($res_1 % 100 === 0){
        $res_2 = $res_1 / 100;
    } else {
        $res_2 = number_format($res_1 / 100,2);
    }
    echo $a . ':' . $res_2 . PHP_EOL; 
}
5:1.67
10:3.33
15:5
100:33.33
120:40
125:41.67
130:43.33
140:46.67


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/06 17:51

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

    キャンセル

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17798questions

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