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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Q&A

解決済

1回答

521閲覧

PHPでブラウザとコマンドで小数点の出力が異なる

web_tobby

総合スコア1

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

0グッド

0クリップ

投稿2023/05/16 18:20

編集2023/05/17 05:48

実現したいこと

  • ブラウザとコマンドで実行した際のfloatの表示が異なっています。
  • 小数点の誤差を発生させないようにしたいのですが、どこをどうやったらいいか検討がつかないので、アドバイスをいただけると助かります。

該当のソースコード

PHP

1$array = array(); 2$array["num"] = 139.4623601; 3 4 5$return_json=json_encode($array,JSON_PRETTY_PRINT); 6header('Content-type: application/json'); 7echo $return_json;

発生している問題

#コマンドで実行時 { "num": 139.4623601 } #ブラウザで実行時 { "num": 139.46236010000001 }

実際の画面(ロリポップ側のサーバー)

#コマンドで実行時
イメージ説明

#ブラウザからアクセスした時
https://at-matome.net/sample.php
イメージ説明

環境

https://lolipop.jp/service/server-spec/
PHP 7.4 モジュール版、ロリポップというレン鯖に配置しています。

実際の画面(ローカル、cygwin上での実行)

イメージ説明

環境

cygwin上のphp,7.3.7と表示されている

実際の画面(ローカル、xamppでブラウザからアクセス)

イメージ説明

環境

xampp,php 8.2.4

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

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

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

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

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

m.ts10806

2023/05/16 21:07

環境情報、操作方法など具体的に記載してください
退会済みユーザー

退会済みユーザー

2023/05/16 21:53

不動小数点にはマルメの誤差が生ずるということは認識した上での質問ですか?
yambejp

2023/05/17 00:22

「コマンドで実行」「ブラウザで実行」はそれぞれどうやって実行してどうやって結果を得ていますか?
web_tobby

2023/05/17 00:50

>m.ts10806さん 環境とはphpinfoを全文記載したらよいでしょうか? 操作方法は、コマンドで実行はサーバー側で php sample.php と叩いたものです。 ブラウザで実行は https://hogehoge.com/sample.php を叩いたものです。
web_tobby

2023/05/17 00:51

>SurferOnWww さん はい、認識をしていますが、今回は誤差が出る時出ない時について質問です。 floorで桁を削ったとしても、改善されず、どうしたものかと悩んでいます。
web_tobby

2023/05/17 00:52

>yambejpさん コマンドで実行とは、sshでサーバーへログインを行い、 php sample.php を実行しました。 ブラウザで実行とは、https://hogehoge.com/sample.php のように ブラウザから叩いたものです。
退会済みユーザー

退会済みユーザー

2023/05/17 02:31 編集

マルメの誤差が表示されるようにしたからそう見えるだけのように見えますけど? 質問のソースを見ると PHP のオブジェクトを JSON 形式の文字列にシリアライズしたということのようで、コードの中の return_json に代入されたものが「#コマンドで実行時」した JSON 文字列に見えますがそうなんですか? で、「ブラウザで実行」ってどういうことですか? 「ブラウザから叩いた」とか言われても意味が不明ですけど。
m.ts10806

2023/05/17 04:07

質問は編集できますので。 環境とはサーバOS,バージョンなどです。phpinfo()まるごとはさすがに情報量多すぎますので、バージョンの箇所だけでok あとドメインは例示ドメインを。
web_tobby

2023/05/17 04:54

>m.ts10806さん 更新しまして、実際のurl、phpのバージョンなどを記載しました。 よろしくお願いいたします
m.ts10806

2023/05/17 05:26 編集

もう一点試してもらいたいのが、ローカルPCに構築した場合は実行結果どうなりますか?(可能ならPHPは同じバージョン)
web_tobby

2023/05/17 05:46

>m.ts10806さん 度々ご確認ありがとうございます。 xamppをインストールし、同じコードをブラウザで表示したところ、 問題は発生しませんでした。 バージョンは、PHP Version 8.2.4 です。 やはりこれはサーバー側の設定に起因してるものなのでしょうか?
m.ts10806

2023/05/17 07:01 編集

バージョン違うので単純に判断はできませんが、浮動小数点問題は割とあるので出たものそのまま使うか、仕様として桁決めて丸めるかしかないようには思います。(つまり原因追求に時間を費やすのではなく「どうしたいか。なにを正とするか」で対応を決める。) 自身は別言語への移行で問題に直面したことはありますが、同じサーバ同じ言語同じバージョンでは経験ないのでなんともですが。
yambejp

2023/05/17 06:28

想定外の誤差をだしたくないんなら数値でも文字列として渡せばよいのでは?
web_tobby

2023/05/17 07:05

>m.ts10806さん おっしゃるとおりだと思います。もうこういうものだということを理解した上で、対応していこうと思います。 ご確認いただきありがとうございました。
web_tobby

2023/05/17 07:07

>yambejpさん はい、yambejpさんのおっしゃるとおりで、文字列で渡して、受信側でcastしようかと思います。 元々はswift側で受信する際に型が違ってエラーが出るので、floatで作りたかったのですが、おっしゃるとおり文字列で対応していったほうが安全かなと思いました。 色々とアドバイス助かりました。ありがとうございます
m.ts10806

2023/05/17 07:13

>元々はswift側で受信する際に型が違ってエラーが出る 次からで良いのでこの手の前提は記載されたほうが良いと思います。 XY問題が発生して本来解決したい課題のゴールに向かわない可能性もでてきますので。
web_tobby

2023/05/17 15:04

>m.ts10806さん アドバイスありがとうございます! 次回困った時には、もうちょっと広く記載しようと思います
guest

回答1

0

ベストアンサー

普通にfetchで得ても命題のような誤差は発生しません

javascript

1fetch('sample.php').then(res=>res.text()).then(console.log); 2fetch('sample.php').then(res=>res.json()).then(console.log);

投稿2023/05/17 00:23

yambejp

総合スコア114814

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

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

web_tobby

2023/05/17 07:14

質問へのコメントに記載していただいた、文字列として扱う で対応しようと思いました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問