- 2017/06/28 【一覧】Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較
- 2014/12/05 【PHP】【Android】apk ファイルを PHP でダウンロードする
- 2014/08/03 【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
- 2014/08/01 【Java】【Android】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
- 2014/07/31 【Java】【Android】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
« prev next »
【一覧】Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較 
2017/06/28 Wed [edit]
先日、言語間で算術関数を含む移植などしてたら、結果が違ってたので改めて調べてみた。「負の値の割り算や剰余」なんかもそうだけど、言語仕様によって値が違ってたりするので、毎回確認するのは面倒なんだよね。せっかくなので、一覧にしていつでも見れるようにしておこうと考えた。
(元の値) | Java | JavaScript | C# | Python3 | Ruby | PHP |
---|---|---|---|---|---|---|
Math.round | Math.round | Math.Round | round | round | round | |
-2.0 | -2 | -2 | -2 | -2 | -2 | -2 |
-1.6 | -2 | -2 | -2 | -2 | -2 | -2 |
-1.5 | -1 | -1 | -2 | -2 | -2 | -2 |
-1.4 | -1 | -1 | -1 | -1 | -1 | -1 |
-1.0 | -1 | -1 | -1 | -1 | -1 | -1 |
-0.6 | -1 | -1 | -1 | -1 | -1 | -1 |
-0.5 | 0 | 0 | 0 | 0 | -1 | -1 |
-0.4 | 0 | 0 | 0 | 0 | 0 | 0 |
0.0 | 0 | 0 | 0 | 0 | 0 | 0 |
0.4 | 0 | 0 | 0 | 0 | 0 | 0 |
0.5 | 1 | 1 | 0 | 0 | 1 | 1 |
0.6 | 1 | 1 | 1 | 1 | 1 | 1 |
1.0 | 1 | 1 | 1 | 1 | 1 | 1 |
1.4 | 1 | 1 | 1 | 1 | 1 | 1 |
1.5 | 2 | 2 | 2 | 2 | 2 | 2 |
1.6 | 2 | 2 | 2 | 2 | 2 | 2 |
2.0 | 2 | 2 | 2 | 2 | 2 | 2 |
実際の結果は以下の通り。paiza.io で比較した。
言語によっては丸め方法のオプションなんかもあるが、そのまま使ってると四捨五入っぽかったり、五捨六入っぽかったり、0からの距離っぽかったり、値の境界が異なるので、複数の言語を使うときには気をつけた方が良いだろう。
どうしても揃えたければ
floor(v + 0.5)
のようにする手もある。
また、「0からの距離でグループ分け」と「等間隔にグループ分け」で使い分けをすることもできるので、知っておいても損はないだろう。
まぁ、何にしても、「負の値の演算」「丸め誤差を持つ演算」「0をまたぐ演算」あたりは仕様を確認しておいた方が良いだろう。
(関連記事)
【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double 版]
【Unity】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す
- 関連記事
-
-
トランジションルール画像の自動生成を移植
-
Android と Applet の互換ってできるもんだね
-
HTMLカラー名・カラーコード表
-
【一覧】Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較
-
category: プログラミング
thread: プログラミング
janre: コンピュータ
tag: Java C# PHP Ruby Python JavaScript 一覧 算術関数【PHP】【Android】apk ファイルを PHP でダウンロードする 
2014/12/05 Fri [edit]
内容的には「画像を PHP から送信して、Android で受信する」とあまり変わらない。
サーバーによっては、「.htaccess」に、
AddType application/vnd.android.package-archive .apk
を追加しただけで、リンクからダウンロードできる場合もあるが、レンタルサーバーなどは上手くできない事もあるので、そういうとき PHP でダウンロードできるようにするスクリプト。
とりあえずファイル名を「dl.php」とすると、
■apk 用 ダウンローダ PHP (dl.php)
<?php
$filename = $_SERVER['QUERY_STRING'].'.apk';
if (file_exists($filename)) {
header('Content-Type: application/vnd.android.package-archive');
header('Content-disposition: attachment; filename='.$filename);
header('Content-Length: '.filesize($filename));
readfile($filename);
exit;
}
?>
でOK。header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。
ダウンロード用のリンクは、
<a href="dl.php?Sample">Sample</a>
のように名前(Sample)だけ「?」の後に書いておけば、「Sample.apk」としてダウンロードされる。
また、ブラウザが HTML5 仕様なら、<A> タグの download 属性 を付けた方が良いかも知れない。
(参考)
・PDFなどのファイルを強制的にダウンロードさせる3つ方法の比較
ちなみに野良アプリ配布の場合は、スマホ端末の「提供元不明のアプリのインストールを許可」してないとインストールできない事があるので、注意書きをして置くと親切かもしれない。
少し改造して、名前ごとのカウントをデータベースに記録しておけば、ダウンロード数なども表示できると思う。
(関連記事)
【PHP】【Android】画像を PHP から送信して、Android で受信する
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する 
2014/08/03 Sun [edit]
以前に、JSON (テキストデータ) を PHP から送信して、Java で受け取ることができたので、今回はそれと同じ考え方で、画像の送受信に置き換えてみる。わざわざ PHP を通してダウンロードしているわけだが、もちろん直接画像のURLにアクセスしてダウンロードしても構わない。PHP でダウンロードする利点はファイル名をデータベースなどに入れて置いて、同じURLで内容を入れ替えられる点だ。この方法なら、画像ファイルを直接アクセスできない場所に置いて、ファイル自体を隠蔽化することもできる。
クライアント側は Java にしたいので、とりあえず Android にする。画像のデコードはプラットフォームごとに異なるので、その部分だけ入れ替えれば、流用もできるだろう。
PHP のサンプルコードは超絶簡単なものにする。エラーなどはあまり考えてないので、必要なら適当に付け加えた方が良いだろう。とりあえずファイル名を「image_out.php」としておく。
■画像送信用 PHP(image_out.php)
<?php
$fileName = "img/sample.jpg"; //ファイル名
if (file_exists($fileName)) {
header('Content-type: image/jpeg');
header('Content-Length: '.filesize($fileName)); //あった方が良い
readfile($fileName); //ファイルを読み込んで標準出力に書き出し
exit;
}
?>
header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。
このサンプルの場合は、画像ファイル名が固定されているので Content-type が固定されているが、データベースなどからファイル名を読み込んで、画像を切替える場合は、拡張子などで Content-type を切り替えるようにした方が良いだろう。
ちなみに png と gif の Content-type は、
header('Content-Type: image/png');
header('Content-Type: image/gif');
となる。また、Android では gif はサポート対象外なので、あまり使わない方が良いかも知れない。透過したい場合は png が良いだろう。
一緒に Content-Length も出力しているが、画像ファイルの場合はあった方が良い。ないと以下の Java コードで Content-Length = -1 (不明)となる。あらかじめファイルサイズを取得して、縮小してダウンロードするときなどには必要になるだろう。ちなみにテキストファイル(text/plain)の場合はコードを書かなくても、Content-Length は勝手に付いてくる(書いても問題ない)。
あとは、Android 側で画像の受信とデコードをする。以前の JSON 用コードとあまり変わらないので、目新しいものは無いかも知れない。また、Android の場合、マニフェストファイル(AndroidManifest.xml)にインターネット接続用のパーミッションが必要になる。
■インターネット接続用のパーミッション(AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />
■画像受信用 Java (Android 用)
//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 15 * 1000; //接続タイムアウト[ms]
String phpUrl = "http://(テストするサーバー)/image_out.php"; //画像送信用 PHPのURL
Bitmap bitmap = null; //受信した画像を入れる
try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setRequestMethod("GET");
con.connect();
bitmap = BitmapFactory.decodeStream(con.getInputStream()); //画像デコード
//確認用
System.out.println("con.getContentType() = " + con.getContentType());
System.out.println("con.getContentLength() = " + con.getContentLength());
System.out.println("con.getResponseCode() = " + con.getResponseCode());
System.out.println("con.getResponseMessage() = " + con.getResponseMessage());
con.disconnect();
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
// ・・・・
// onDraw() などで確認する場合
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
例外処理はかなり手抜きしてるので、必要に応じて適当に。サーバー接続タイムアウトを取得したいなら、catch 節に SocketTimeoutException を加えれば、捕えることができる。
URL は HttpURLConnection を使ってるので「http://」前提だが、「https://」なら、HttpsURLConnection を使った方が良いかも知れない(テスト環境がないので、やったことない)。
また本来なら、サーバーのレスポンスも考慮に入れて、ネットからのダウンロード等は別スレッドでやった方が良いだろう。Android なら Service や AsyncTask がよく使われているようだ。
(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【PHP】【Android】apk ファイルを PHP でダウンロードする
【Java】【Android】【PHP】【JSON】JSON を Java から送信して、PHP で受信する 
2014/08/01 Fri [edit]
さらに前回の続き。
今回は逆に、Java から JSON を送信して、PHP で受け取ってみるテスト。
色々サンプルを調べてみたが、URLConnection と HttpClient(Android) の例が多かったので、とりあえず、前回使った HttpURLConnection をそのまま使うことにした。また Android ではどちらかと言うと、URLConnection の方が推奨されているらしいので(軽量で実行速度も速いとか)、流用も簡単かも知れない。
まずは JSON を受信する PHP の方から書いてみる。今回もエラー等は考慮に入れず、超絶簡単なコードにするので、必要なら適当に追加して欲しい。とりあえずファイル名を「json_in.php」とする。
■JSON 形式データ受信用 PHP(json_in.php)
<?php
require_once("JSON.php"); //JSON 変換ライブラリ
//リクエストの body 部から生のデータを読み込む
$input = file_get_contents('php://input');
//JSON のデコード
$json = new Services_JSON;
$data = $json->decode($input);
//以下確認用
header('Content-type: text/plain; charset=utf-8');
foreach($data as $key => $val) {
echo $key.' = '.$val."\n";
}
?>
「確認用」のコードは本分と関係ないので、本来ならデータベース等に記録する処理などに変更すると良いだろう。
以下の Java サンプルで JSON を POST で送っているが、PHP 側で $_POST で受け取ると余計なエスケープが付くので、読み取り専用の生のデータを取得するようにした。$HTTP_RAW_POST_DATA が使えるサーバなら、そちらでも良いかも知れない。ただ「php://」の方法なら、設定ファイル「php.ini」はいじらなくて済む利点がある。また試しに日本語も送ってみたが、"UTF-8" 固定ならば問題なく受信できた。
次に JSON 送信用の Java コードを書いてみる。これも例外処理は手抜きなので、必要に応じて追加した方が良いかも知れない。また確認用に前回作った readLinesText() とデータ格納用構造体(クラス)、定数などもそのまま使っている。
■JSON 形式データ送信用 Java
//データ格納用クラス(構造体)[※前回と同じもの]
public class Data {
public String name;
public int age;
public boolean male;
public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}
//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 10 * 1000; //接続タイムアウト[ms]
final int READ_TIMEOUT = 5 * 1000; //読み取りタイムアウト[ms]
final String ENCORDING = "UTF-8"; //エンコードは固定
String phpUrl = "http://(テストするサーバー)/json_in.php"; //JSON 受信用 PHPのURL
try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setReadTimeout(READ_TIMEOUT); //読み取りタイムアウト
con.setRequestMethod("POST"); //"GET"でも可
con.setDoOutput(true); //出力用接続フラグON
con.connect();
//適当にデータを定義
Data data4 = new Data("マック", 21, true);
// Data data4 = new Data("シンディ", 16, false);
//データ用クラス から、JSON 形式に変換
Gson gson = new Gson();
String text4 = gson.toJson(data4);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), ENCORDING)));
pw.write(text4); //出力
pw.close(); //フラッシュして閉じる
//PHP からの応答(確認用)
System.out.println("[Response]");
String res = readLinesText(con.getInputStream()); //※前回作ったもの
System.out.println(res);
con.disconnect();
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
結果は以下の通り。
[Response]
name = マック
age = 21
male = 1
boolean 型は PHP 側では true → 1、 false → 空文字 になるので注意。
HttpURLConnection の定義部分に関しては、前回のコード に setDoOutput(true) を追加して出力用接続をONにし、setRequestMethod() を POST に代えただけである。リクエストは GET でも構わない。以下のURLエンコードの方法の場合、データ量を考えないで済むので POST にした。また GET より POST の方が少しばかりデータの隠蔽性があるという利点もある。
PHP 側で $_POST で受け取りたいなら、JSON エンコード後に、
String text4 = gson.toJson(data4);
String enc = URLEncoder.encode(text4, ENCORDING); //URLエンコードする
text4 = "data=" + enc; //POSTするクエリ
のように URL エンコードして、pw.write(text4) で書き出せば、PHP 側で $_POST['data'] で受け取れる。ただし、先に述べたように、$_POST の場合は余計なエスケープ('\')が付くので、stripslashes($_POST['data']) などして、エスケープを除去する必要がある。
また、日本語を Unicode の表現 (\uffff) に変換しても可能だったが、JSON(GSON) 変換などで、更にエスケープ('\')が増えたりするので、デコードには要注意だ。送信側と受信側のエスケープの数のつじつま合わせをしなければならない。Java での Unicode 変換は非常に良いサンプルがあったので、参考に載せておこう。PHP 側の JSON デコードはライブラリが Unicode デコードも勝手にやってくれるみたいだ。日本語が絡むと色々複雑になってくるので、その辺は自由に書き換えて貰いたい。
(参考) JavaのUnicode文字列の変換用メソッド
(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う
【Java】【Android】【PHP】【JSON】JSON を PHP から送信して、Java で受信する 
2014/07/31 Thu [edit]
前回、Google の Gson(Json) による JSON 形式デコードが上手くいったので、今回は PHP から Java での受信を試みる。
というわけで PHP の方にも JSON 変換のライブラリが必要なので、以下からダウンロード。
・http://mike.teczno.com/JSON.tar.gz
・PHPからJSON作成を扱う
(*)どちらも同じ。
アーカイブを解凍したら、ドキュメントやサンプルなどを含めて色々出てくると思うが、とりあえず変換ライブラリ「JSON.php」をサーバーに配置する。
サンプルコードは超絶簡単なものにする。エラーなどは考えてないので、必要なら適当に付け加えて欲しい。とりあえずファイル名を「json_out.php」としておく。
■JSON 形式データ送信用 PHP(json_out.php)
<?php
require_once("JSON.php"); //JSON 変換ライブラリ
//テスト用データ
$data = array(
"name" => "John",
"age" => 22,
"male" => true
);
$json = new Services_JSON;
$encode = $json->encode($data); //JSON 形式へエンコード
header('Content-type: text/plain; charset=utf-8');
echo $encode; //テキスト出力
?>
header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。
Content-type の出力としては、
header('Content-Type: text/javascript; charset=utf-8');
header('Content-type: application/json');
なども使えたが、以降の Java コードで、Content-Length が上手く取れなかったので、text/plain にしておいた。クライアントアプリによって、必要に応じて変更しても良いだろう。
次に、ストリームからの読み込みに新たに readLinesText() という関数を作ってみた。エンコードがあらかじめ "UTF-8" と決めてあって、データ受信にしか使用ないような、固定用途なら問題なく使える。その他には、以前「テキストファイルの読み込み」で作った loadText(), readStream() もそのまま使える。この2つの関数を簡易的にまとめたものに近い。小さなデータを頻繁に読み込むなら、readLinesText() の方が少しばかり速い気がする。どちらを使っても構わない。
■ストリームから行読みするライブラリ readLinesText()
//Reader でのテキスト読み込み(※最後に改行が付くので編集用には向かない。エンコードもシステム依存)
public static final String readLinesText(InputStream is) throws IOException {
final StringBuilder str = new StringBuilder();
final String sep = System.getProperty("line.separator"); //改行コード
final BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
while (br.ready()) {
str.append(br.readLine()); //終端文字は含まない
str.append(sep); //改行コード追加
}
return str.toString();
} finally {
try {
br.close();
} catch (Exception e) {
//IOException
}
str.setLength(0);
}
}
あとは、前回作ったサンプルをそのまま使って、Java で JSON を取得してみる。
■JSON 形式データ受信用 Java
//データ格納用クラス(構造体)[※前回と同じもの]
public class Data {
public String name;
public int age;
public boolean male;
public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}
//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 10 * 1000; //接続タイムアウト[ms]
final int READ_TIMEOUT = 5 * 1000; //読み取りタイムアウト[ms]
final String ENCORDING = "UTF-8"; //loadText() 用
String phpUrl = "http://(テストするサーバー)/json_out.php"; //JSON 送信用 PHPのURL
try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setReadTimeout(READ_TIMEOUT); //読み取りタイムアウト
con.setRequestMethod("GET");
con.connect();
String text3 = readLinesText(con.getInputStream());
// String text3 = loadText(con.getInputStream(), ENCORDING); //※以前作ったライブラリ
con.disconnect();
//確認
System.out.println(text3);
//JSON 解析して、データ用クラスに代入
Gson gson = new Gson();
Data data3 = gson.fromJson(text3, Data.class);
//確認
System.out.println("[Data3]");
System.out.println("name = " + data3.name);
System.out.println("age = " + data3.age);
System.out.println("male = " + data3.male);
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
結果は以下の通り。
{"name":"John","age":22,"male":true}
[Data3]
name = John
age = 22
male = true
例外処理はかなり手抜きしてるので、必要に応じて適当に。
URL は HttpURLConnection を使ってるので「http://」前提だが、「https://」なら、HttpsURLConnection を使った方が良いかも知れない(テスト環境がないので、やったことない)。またこの程度のサンプルなら、URLConnection でも使える(con.setRequestMethod("GET"); の行を削除。デフォルトで GET なので問題ない)。
PHP は非常に簡単なサンプルだが、内容をデータベースからの読み込みに変更して JSON 出力にすれば、色々応用できるだろう。また本来なら、サーバーのレスポンスも考慮に入れて、ネットからのダウンロード等は別スレッドでやった方が良い。Android なら Service や AsyncTask がよく使われているようだ。
(関連記事)
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う
| h o m e |