トップページ⇒tech
1002コメント464KB

+ JavaScript(ECMAScript)質問用スレッド vol.122 + [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/08/29(月) 01:23:24.09ID:MUTWRWKo
プログラマ板の趣旨にあわせてブラウザ限定ではなくサーバーサイドJavaScriptや
トランスパイラなどの関連技術の話題も取り扱うように変わりました。

ECMAScriptの言語仕様の話題。最新ECMAScriptによるモダンな書き方、Promiseやasync/awaitを
使った非同期プログラミング。ES2015、2016、2017等の最新ECMAScriptをブラウザで今すぐ使う方法、
ビルド環境やbowerやnodeのパッケージを使う方法等、モダンなJavaScript環境についての幅広い話をしましょう。

ECMAScript対応実行環境一覧(ブラウザやbabelを含む)
http://kangax.github.io/compat-table/es5/
http://kangax.github.io/compat-table/es6/ (= es2015)
http://kangax.github.io/compat-table/es2016plus/
http://kangax.github.io/compat-table/esnext/

JavaScriptとは?
もともとMozillaの前身のNetscapeが作った言語であり本来のJavaScriptはFirefoxの実装のみです。
JavaScriptの正式な仕様名はECMAScriptです。ですが一般に使われているとおり
ChromeやEdgeで使う言語もJavaScriptとしてこのスレでは扱います。
Firefox等のJavaScript実装は最新のECMAScriptに準拠しています。

※DOMはブラウザが提供しているものでありJavaScript(ECMAScript)の範囲外です。
なのでDOMを使ったプログラミングは原則としてこのスレの対象外です。
DOMはwindowオブジェクト(ブラウザのホストオブジェクト)経由で
参照するもので、window自体、window.document、window.Workerなどです。
これに関する話題はWeb制作板の下記のスレに移動してください。

+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1467906819/
+ JavaScript の質問用スレッド vol.130 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1463395557/

前スレ + JavaScript の質問用スレッド vol.121 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1468158373/
0573デフォルトの名無しさん2016/10/10(月) 21:27:42.34ID:c135JfrF
>>570
getElementsByTagNameは疑似配列を返す
[0]がなかったら動かないはずだ
0574デフォルトの名無しさん2016/10/11(火) 05:55:53.39ID:GK6S8De2
そうなんですか
0575デフォルトの名無しさん2016/10/11(火) 22:11:58.12ID:Ld7sCMib
document.body でいいだろ。

というか、<html>/<body> 以外は特に querySelectorAll() をできるだけ使え。
もう getElementById(), getElementsByTagName() を使わないようにすべき。

なぜ getElementById() を使わないか?
var e = document.getElementById('E');
if (e) {console.log(e.id);}
と、わざわざ注意して if を書くよりも
[...document.querySelectorAll('#E')].forEach(e => console.log(e.id));
とか
[for (e of document.querySelectorAll('#E')) e].forEach(略);
とか
Array.from(document.querySelectorAll('#E')).forEach(略);
とか
Array.prototype.slice.call(document.querySelectorAll('#E'), 0).forEach(略);
とかの方が簡潔で高抽象で安定するだろ。
さらに、もし
Array.of(document.getElementById('#E')).filter(e => !!e).forEach(略);
なんて書いたら、filter が if と同じことになるわけで、結局、querySelectorAll() にしときゃ良かったとなるわけだ。

なぜ getElementsByTagName() を使わないか?
これも同様。略。
更に、getElementsByTagNameNS() も選択肢にしなきゃならないXHTMLだったらどうすんのって理由もある。
0576デフォルトの名無しさん2016/10/12(水) 00:01:01.78ID:bJD9Q0hO
なぜってjQueryがあるのに、わざわざそんな冗長なことを
書く必要が無いからでは?

毎回Array.prototype.slice.callとかアホらしいw

var e = document.getElementById('E');
↓
var $e = $('#E');

[...document.querySelectorAll('#E')].forEach(e => console.log(e.id));
[for (e of document.querySelectorAll('#E')) e].forEach(略);
Array.from(document.querySelectorAll('#E')).forEach(略);
Array.prototype.slice.call(document.querySelectorAll('#E'), 0).forEach(略);
↓
$('#E').each(function() { console.log(e.id) });
0577デフォルトの名無しさん2016/10/12(水) 00:14:50.40ID:bJD9Q0hO
訂正

$('#E').each(function() { console.log(this.id) });
0578デフォルトの名無しさん2016/10/12(水) 02:21:42.25ID:7Aphq+NE
javascriptファイルを自分のパソコンでは実行できるけれど
他人のパソコンでは実行できないようにしたいのですが、
そんな事可能でしょうか?
0579デフォルトの名無しさん2016/10/12(水) 05:13:14.63ID:jhqwQTsX
>>578
認証性にして自アカウントでログインしなければsctipt要素を出力しなければいい
0580デフォルトの名無しさん2016/10/12(水) 08:42:49.25ID:L1c8TvqF
>>575
あなたがお勧めする手法はgetElementsByTagNameでも使えるのでgetElementsByTagNameを使わない理由にはならない
違いを説明するならliveに言及すべきたが、liveは設計思想次第で利便性が逆転する部分なのでどちらか優れているという話でもない
ただし、同一tagNameの要素ノード群を得るなら基本的にはgetElementsByTagNameの方が優れているだろう
https://html5experts.jp/yoshikawa_t/1932/
0581デフォルトの名無しさん2016/10/12(水) 20:38:12.37ID:ao75rK/8
>>576
NodeListはイテラブルではないので[...hoge]は使えないし、
Array.fromを使うんなら、forEachを使う必要がない。
やり直し。
0582デフォルトの名無しさん2016/10/12(水) 22:33:54.70ID:bJD9Q0hO
>>581
レスする相手間違えてるぞw

俺の答えは「jQuery使えば普通にeachが使えて古いブラウザでも動いて短く書ける」だ

$('#E').each(function() { console.log(e.id) });
0583デフォルトの名無しさん2016/10/15(土) 05:07:47.47ID:lTqPwJwr
間違いなく要素配列を返す$関数を自作した方がいい。
普通の配列はforEachを使ってるのに、要素配列はeachを使わないといけないのは不便でおかしいから。

jQueryのまずいところの一つはライブラリと言いながら重厚でフレームワークのよう。
一つ使い始めたらその世界全てを受け入れるしか無い。それがまた最新の標準から見て古臭いという点。

つまり機能の補足としてeach的なのが使いたいだけならjQueryを持ってくるのはアホだし、
もっと全体を考えるなら、jQueryよりよっぽど標準と親和性の高いまともなフレームワークを使ったほうが良い。
0584デフォルトの名無しさん2016/10/15(土) 08:49:38.99ID:WUtYR0l7
>>583
それは自己妄想だろ?w
0585デフォルトの名無しさん2016/10/15(土) 10:59:50.26ID:8Bk/hmGM
> jQueryのまずいところの一つはライブラリと言いながら重厚でフレームワークのよう。
ん? どこが?

フレームワークというのは、フレームワークから決まった関数が呼ばれるから
その中身を書くもの。ライブラリは用意された関数を呼び出すもの。
どう見てもライブラリなんだが。DOM操作の代わりでしか無い。
0586デフォルトの名無しさん2016/10/16(日) 20:58:57.45ID:LWTFfjDf
JavaScript入門者です。
クロージャで躓いています。

function Counter() {
var n = 0;
return function () {
return ++n;
};
}
var a = Counter();

a(); // 1
a(); // 2
a(); // 3

これでなぜ増えていくのかが分かりません。
a(); を呼ぶ度に、var n = 0; が実行されるはずなので、増えていかないと思うのですが…
なぜ var n = 0; は実行されないのですか?
0587デフォルトの名無しさん2016/10/16(日) 21:05:46.88ID:jbRBUkYK
>>586
仕様です
0588デフォルトの名無しさん2016/10/16(日) 21:07:45.08ID:cgLhTvvH
>>586
aの中に何が入っているか、書き出してみてごらん
0589デフォルトの名無しさん2016/10/16(日) 21:21:34.20ID:LWTFfjDf
>>588
書き出してみるには、どうすればいいのでしょうか?
0590デフォルトの名無しさん2016/10/16(日) 21:27:41.70ID:cgLhTvvH
>>589
手で
0591デフォルトの名無しさん2016/10/16(日) 21:33:14.24ID:r3gdRhV6
>>586
a()は
function () {
return ++n;
};
でしょ
n = 0は実行されてない
0592デフォルトの名無しさん2016/10/16(日) 21:34:44.24ID:LWTFfjDf
>>590
手? こういうことですか?

a() {
var n = 0;
return function () {
return ++n;
};
0593デフォルトの名無しさん2016/10/16(日) 21:36:43.79ID:CBxMhCnR
>>586
n = 0は一番最初に起動したときに
初期設定として入力されるだけで、あとはこれは呼び出されません
0594デフォルトの名無しさん2016/10/16(日) 21:42:13.57ID:LWTFfjDf
>>591
なぜ返り値だけになるのですか?
var n = 0; も一緒じゃないんですか?
0595デフォルトの名無しさん2016/10/16(日) 21:42:56.22ID:UhSHekdN
>>589
console.logかFunction#toString
0596デフォルトの名無しさん2016/10/16(日) 21:44:43.73ID:LWTFfjDf
>>593
「一番最初に起動したとき」というのは、
a(); // 1
のときでしょうか?
0597デフォルトの名無しさん2016/10/16(日) 21:57:12.53ID:LWTFfjDf
>>595
それはどうやればいいのでしょうか?
参考書を読んでいるだけなので、デバッグの仕方もよく分かりません。
0598デフォルトの名無しさん2016/10/16(日) 21:57:36.43ID:cgLhTvvH
function Counter() {
var n = 0;
return n;
}

var a = Counter();

この場合にaの中に何が入っているかわかるのなら、
>>586でaの中に何が入ってるかは
置き換えるだけだろ
0599デフォルトの名無しさん2016/10/16(日) 21:58:23.73ID:cgLhTvvH
> なぜ返り値だけになるのですか?

>>598で返り値だけになるのなんて当たり前だよね?
0600デフォルトの名無しさん2016/10/16(日) 22:04:46.53ID:LWTFfjDf
>>598
aの中には、
var n = 0;
return n;
が入ってるのではないのですか?
なぜ、n = 0; は省かれるのですか?
0601デフォルトの名無しさん2016/10/16(日) 22:12:37.29ID:LWTFfjDf
>>600
間違えました。
aには返り値が入ります。なので、>>598の場合は、aにはnが入って、つまり返り値だけになるのは分かります。

しかし、a(); の場合は、
var n = 0;
return n;
なぜ、こうならないのかが分かりません。
0602デフォルトの名無しさん2016/10/16(日) 22:21:40.38ID:22TTvDK/
そうするのが論理的で整合的だってことで話し合ってそういう実装にすることになっただけだよ。
JS以前からある思想を踏襲してるんじゃない?
Pythonかなんか知らんけどお
0603デフォルトの名無しさん2016/10/16(日) 22:26:43.07ID:r3gdRhV6
>>594
>なぜ返り値だけになるのですか?
キミがCounter()をそのように作ったから

>var n = 0; も一緒じゃないんですか?
return function() {return n++;}
のどこにn=0がある?
0604デフォルトの名無しさん2016/10/16(日) 22:32:07.26ID:LWTFfjDf
あー、分かりました。
オブジェクトのコピーと混同してました。

var a = Counter();
確かにこれで、var n = 0; は入らないですね。返り値を代入しているだけだから。
すなわち、aには返り値の無名関数が入ると。

で、当然、a();には n = 0 は入ってなくて無名関数だけだから、呼ぶ度に加算される。
0605デフォルトの名無しさん2016/10/16(日) 22:33:40.23ID:LWTFfjDf
>>603
今になって思えば、まさしくその通りです(笑)
0606デフォルトの名無しさん2016/10/16(日) 22:35:45.09ID:LWTFfjDf
>>598
何度もよく読み返してみて自分の誤解に気づきました。
ありがとうございます。
0607デフォルトの名無しさん2016/10/16(日) 22:57:07.10ID:cgLhTvvH
あー、うん。そしてconsole.log(a)すれば
aの中身は表示されるよ。
0608デフォルトの名無しさん2016/10/16(日) 23:27:01.47ID:LWTFfjDf
>>607
出ました。これが!

function () {
return ++n;
}

よーし、明日からまた頑張るぞ!
0609デフォルトの名無しさん2016/10/17(月) 09:44:12.70ID:JGocT82E
>>586
いや、nじゃなくてaを考えろよ
0610デフォルトの名無しさん2016/10/17(月) 10:02:05.92ID:5vFd9dbv
>>609
周回遅れってわかってる?
0611デフォルトの名無しさん2016/10/17(月) 10:35:49.18ID:SVcsoL0R
++n;
これに何の意味、活用性があるのか?
小一時間問い詰めたい
0612デフォルトの名無しさん2016/10/17(月) 11:35:06.10ID:5vFd9dbv
>>611
キミは周回遅れ以前、出場資格ない
0613デフォルトの名無しさん2016/10/17(月) 11:44:08.56ID:EnKnOK0g
>>611
ベーシックしか知らない方ですか?
0614デフォルトの名無しさん2016/10/17(月) 12:15:27.10ID:k5b8iytR
>>611
「インクリメントした値を返す意味がある」としか答えようがないな
リファレンスを読み直しておいで
0615デフォルトの名無しさん2016/10/17(月) 19:20:09.73ID:wBVSlf54
>>610
馬鹿は口を閉じてろよザッコww
何仕切ってんだこのヴァカがw
0616デフォルトの名無しさん2016/10/17(月) 19:49:26.05ID:5vFd9dbv
仕切ってなんかいない 見下してるだけだ
0617デフォルトの名無しさん2016/10/17(月) 20:08:48.29ID:wBVSlf54
>>616
馬鹿は口を閉じてろww
0618デフォルトの名無しさん2016/10/17(月) 22:12:14.86ID:MSv6dw6i
>>586
現実的にこんな処理が必要になる状況ってあるの?
0619デフォルトの名無しさん2016/10/17(月) 22:21:09.76ID:xorYyxjj
let result = "1\r\n2\r\n".match(/^/mg);
console.log(result);
1の前と、2の前と、最後の\nの前にマッチしてほしいが
1の前と、1つ目の\nの前と、2の前と、2つ目の\nの前と、2つ目の\nの後ろにマッチしてしまう

let result = "1\r\n2\r\n".match(/$/mg);
console.log(result);
1の後ろと、2の後ろと、2つ目の\nの後ろにマッチしてほしいが
1の後ろと、1つ目の\rの後ろ、2の後ろと、2つ目の\rの後ろと、2つ目の\nの後ろにマッチしてしまう

CRLFを含んだ文字列を処理するうまい方法はないものでしょうか?
仕様とあきらめて、LFのみに変換するしかないのでしょうか?
0620デフォルトの名無しさん2016/10/17(月) 22:29:29.43ID:xorYyxjj
>>619
訂正
1の前と、2の前と、2つ目の\nの後ろにマッチしてほしいが

補足
もう少しわかりやすく書くと、以下のようになってしまうのを修正したいです
result = "1\r\n2\r\n".replace(/^/mg, "!");
^1^
^2^
^
result = "1\r\n2\r\n".replace(/$/mg, "$");
1$$
2$$
$
0621デフォルトの名無しさん2016/10/17(月) 22:49:51.36ID:5vFd9dbv
>>617
お前、口開けてキーボード叩いてるのか?
知恵遅れの習性は謎だらけだ
0622デフォルトの名無しさん2016/10/17(月) 23:36:27.61ID:Da5IbuDC
口閉じろっていうのは喋るな(書き込むな)って意味だろう?
0623デフォルトの名無しさん2016/10/18(火) 01:13:52.49ID:sMICGAt6
>>619-620
>1\r\n2\r\n
>1の前と、2の前と、2つ目の\nの後ろに、マッチしてほしい

1の前・2の前は、行頭だろ。
2つ目の\nの後ろは、全文字列の最後

2つに分けて考える。
それか、全文字列の最後は無視して、正規表現とは別に処理にする
0624デフォルトの名無しさん2016/10/18(火) 01:35:52.87ID:g5oHSCaR
> 1の前と、2の前と、最後の\nの前にマッチしてほしいが
「最後の\nの前」は「\rと\nの間」
1と2は「\nの後ろ」だったのに最後だけなぜ「\nの前」になるのだろうか?
0625デフォルトの名無しさん2016/10/18(火) 03:24:17.45ID:sMICGAt6
>>619
>1の前と、2の前と、最後の\nの前にマッチしてほしい

>>620
で訂正している

>1の前と、2の前と、2つ目の\nの後ろにマッチしてほしい
0626デフォルトの名無しさん2016/10/18(火) 08:02:45.99ID:De2Roj8e
>>618
ちょいちょいあるんじゃない?

>>625
/m消して、\n探しちゃいかんの?
0627デフォルトの名無しさん2016/10/18(火) 09:15:43.00ID:Vsk5WAhm
>>626
>618
ドンな時?
0628デフォルトの名無しさん2016/10/18(火) 09:38:02.36ID:cWVmYcde
>>627
サンプルのコードは単純だけど、たとえばリターンに記述されている
”++n”を三項演算子に書き換えて、上限値に来たらリセットする
ループカウンターにする。
あとは、解析を困難にする為の無駄なコードとして扱う。

サンプルの処理が単純だけど、少し手を加えれば、どの様にでも使える。
0629デフォルトの名無しさん2016/10/18(火) 11:46:33.12ID:g5oHSCaR
itaratorのように外部参照不可にする時、かな
0630デフォルトの名無しさん2016/10/18(火) 11:53:07.40ID:De2Roj8e
>>627
モジュールの中全体で一意な番号が欲しいとき。
シングルスレッドが保証されてるので、正確にはインクリメント演算子は必要無いけど。

>>628
3項演算子もifも、比較文が必要でミスヒットすると悲しいから、Moduloの方が楽だと思う。
06316282016/10/18(火) 12:16:45.66ID:cWVmYcde
>>630
>モジュールの中全体で一意な番号が欲しいとき。
”一意な番号”と云うと固定のenum宣言が頭に有ったけど
番号をmap管理すれば色々と使えますね。
なるほど。

>3項演算子もifも、比較文が必要でミスヒットすると悲しいから、Moduloの方が楽だと思う。
モジュールもある程度意味を持たせなければいけない考えなモノで
分岐処理も例に上げました。
0632デフォルトの名無しさん2016/10/18(火) 16:19:34.97ID:Vk/gbf1F
誰か気象庁の高解像度レーダー画像取得スクリプト作ってないですか?
低速低容量で使いたいので。

古いの(低解像度)
http://hakobe932.hatenablog.com/entry/20060803/1154575478
http://chameleoncyber.org/?p=335

http://www.kototoka.com/entry/2014/08/11/kishoutyou-nowcast-tenki-yohou-gerira-gouu-yosoku-highresorad/
・・・
標準のやつでもいいかな
0633デフォルトの名無しさん2016/10/19(水) 17:30:13.76ID:BuiU+rAj
>>632
自作したら?
ES関係ないのでスレ違い
0634デフォルトの名無しさん2016/10/26(水) 19:54:01.06ID:wme53G2u
インデントの仕方がよくわからないです。

var a={b:function (){}};


ってあった場合どんなふうにインデントするのがいいんですかね。
0635デフォルトの名無しさん2016/10/26(水) 22:19:57.91ID:RGR5F2yC
整形でググる
0636デフォルトの名無しさん2016/10/26(水) 22:49:40.05ID:wme53G2u
医療整形のぺーじばかりでしたよ。
0637デフォルトの名無しさん2016/10/26(水) 22:58:30.79ID:nn4J9Ce2
>>634
var a = {
     b:function (){
      alert(“おまえは💩”);
     }
    };
0638デフォルトの名無しさん2016/10/26(水) 23:02:07.76ID:bmG2AFzy
var a = {
        b:function (){
        }
    };
0639デフォルトの名無しさん2016/10/26(水) 23:23:52.60ID:Tc/AxpVE
>>634
> ってあった場合どんなふうにインデントするのがいいんですかね。
インデントじゃなくてスペースの入れ方だろ?

採用するコーディングスタイル基準による。
こういうのはちゃんとチェックするツールが有って、今だとeslintっていうのが有名。

eslintではスタイルを選ぶことができるが(さらに独自でカスタマイズもできる)
その中で有名なのが、eslint:recommended と airbnb だろう。

eslint:recommended は比較的緩くてその書き方でも問題ない。
airbnbの場合は、var a = { b: function () {} };
(実際は const a = { b() {} }; を推奨される)

改行入れる場合はこうだな。
var a = {
b: function () {}
,
};

あと必ず { の後で改行入れろとか言ってるやつがいるけど、
最近はそれを採用している規約は少ない気がする。

スペースの有無は決まってることが多いけど、
改行の有無は、長ければ改行を入れるという決まりでいいだろう。
もちろん { で改行した場合はインデントを一つ増やす。
0640デフォルトの名無しさん2016/10/26(水) 23:24:20.49ID:Tc/AxpVE
訂正

改行入れる場合はこうだな。
var a = {
 b: function () {},
};
0641デフォルトの名無しさん2016/10/26(水) 23:32:21.50ID:RGR5F2yC
>>634
別に何でもええんやで
0642デフォルトの名無しさん2016/10/26(水) 23:50:35.79ID:d99+vlL4
>>640
もともとの>>634にはなかった末尾カンマを追加する無能
0643デフォルトの名無しさん2016/10/27(木) 00:43:35.94ID:wk+FybyZ
ありがとう、インデントではなくスペースを入れるという考え方か。
著名なソース読んでも、機械的には入れてない気がしてたんだ。
にしても無名関数が読み慣れん。
0644デフォルトの名無しさん2016/10/27(木) 00:50:40.68ID:WMnZ+0Yu
適当にコーディングしていても、ツールで変換すればいい

F12開発者ツールで、JSファイルを整形して開くだけでも、正しく直してくれないか?
0645デフォルトの名無しさん2016/10/28(金) 12:59:15.72ID:pmKmGehb
小数点第一位までしかない1以下の小数を四捨五入して1か0にする方法を教えてください
0.1を0
0.5を1
Math.ceilだと1以上ないとだめでした
0646デフォルトの名無しさん2016/10/28(金) 13:34:11.62ID:dnmvvXjV
>>645
Math.ceil()は繰り上げ、四捨五入ならMath.round()
0647デフォルトの名無しさん2016/10/28(金) 13:47:06.25ID:OnyL+paE
>>645
そんなめんどくさい事しなくても、0.5足してfloorでいいんじゃないの?
0648デフォルトの名無しさん2016/10/29(土) 05:43:28.19ID:gGx5G/bS
0.5足すとか、気持ちわるいよ。
少しずれたりしないの?
0649デフォルトの名無しさん2016/10/29(土) 12:07:08.55ID:yHYEAqhD
>>648
0,5未満なら0,5を足して四捨五入して
0.5以上ならそのまま四捨五入したらいいじゃん
0650デフォルトの名無しさん2016/10/29(土) 12:17:53.47ID:cEJXxPE7
>>648
ズレなくて、切りが良い。
0651デフォルトの名無しさん2016/10/29(土) 14:11:06.80ID:ypb3Na8r
>>650
ずれたんだけど
alert(0.49999999999999999+0.5); // 1
0652デフォルトの名無しさん2016/10/29(土) 14:47:07.98ID:z8URZLOb
>>651
alert(0.49999999999999999); // 0.5

問題外
0653デフォルトの名無しさん2016/10/29(土) 15:25:53.31ID:cEJXxPE7
>>651
jsfiddle.netで実行した結果を上げる。

alert(0.49999999999999999+0.5); // 1
alert(0.49+0.5); // 0.99
alert(0.499+0.5); // 0.999
alert(0.4999+0.5); // 0.9999
alert(0.49999+0.5); // 0.9999899999999999
alert(0.499999+0.5); // 0.9999990000000001

この環境の精度では、小数点以下四桁迄なら大丈夫になる。

”小数点第一位までしかない1以下の小数を四捨五入して1か0にする方法を教えてください”
なので、「小数点以下二桁は無い」事になる。
処理手順は、0.5を足して小数部分を捨てれば良い。
0654デフォルトの名無しさん2016/10/29(土) 18:07:27.02ID:O/3wAc5r
いや四捨五入する関数があるのに何でわざわざ計算してから切り捨てとかしなきゃいけないん?
0655デフォルトの名無しさん2016/10/29(土) 18:16:09.69ID:P+i+TDJ5
>>647
マイナスの時に想定外の動作
0656デフォルトの名無しさん2016/10/29(土) 18:55:02.99ID:Lu2qC+Nv
まさに>>654のいう通り
Math.floorを優先する理由はない
0657デフォルトの名無しさん2016/10/29(土) 19:15:01.21ID:mMTmoVUB
そもそも四捨五入する理由はない
欲しがりません勝つまでは
我慢しろ
0658デフォルトの名無しさん2016/10/29(土) 19:27:12.02ID:Lu2qC+Nv
四捨五入は質問(>>645)の要件なのでどう考えても必要
0659デフォルトの名無しさん2016/10/29(土) 19:52:25.39ID:cEJXxPE7
>>655
コードにする以前の問題。
入力で認めていれば、エラー対応が必要だし
入力で処理に影響する情報を排除すればそのままで済む。

そもそもマイナス扱う処理で四捨五入使うかな?
0660デフォルトの名無しさん2016/10/29(土) 19:53:28.10ID:68KH7Ulz
マイナスのときにどっちに寄せたいかじゃないの?
-0.6を四捨五入でどっちにしたいか。
roundで0にできたっけ?
0661デフォルトの名無しさん2016/10/29(土) 19:57:05.98ID:eSvC8hNl
> 小数点第一位までしかない1以下の小数を四捨五入して1か0にする方法を教えてください
小数点第一位までしかないんだから
Math.round() で解決だろ

バカ
0662デフォルトの名無しさん2016/10/29(土) 20:06:28.52ID:JHScm7pH
ビット & なら Math 演算も不要
( (n) * 2) & 1
n が数でなくとも 0 か 1 になるが
0663デフォルトの名無しさん2016/10/29(土) 20:37:58.28ID:mNGjlCUC
ビット演算は32bitなのが問題
速度を稼ぐために制限付きを承知で使うならいいだろうが
0664デフォルトの名無しさん2016/10/30(日) 01:00:03.39ID:O7t7tgSU
>>659
負の場合、例えば-20000.4は
> 小数点第一位までしかない1以下の小数
をみたすので、エラーでは無い
> 四捨五入して1か0にするには
四捨五入する桁を可変にすれば良いのかな?
0665デフォルトの名無しさん2016/10/30(日) 05:11:47.90ID:hqgegRgF
>>663
ビット演算が速度を稼げるという根拠は?
例えば直近のV8 nightlyのアセンブラで書き直させたBuiltin_MathRoundingOperationよりも速いと言えるの?
結局無駄なf64<->i32キャストが発生するし、実際は速くないよ
速く使おうと思ったらUSE_ASM_Context内や、よっぽど変数の扱いを気を付けて
キャストが全体として起こらないようにしなければならない
0666デフォルトの名無しさん2016/10/30(日) 05:55:23.89ID:h7Os3ze3
変数の扱いを気を付けてキャストが全体として起こらないようにすると
ビット演算は速度を稼げると
>>665は申しております。
0667デフォルトの名無しさん2016/10/30(日) 10:21:13.83ID:UrnMpVuD
小数一桁の数値を丸めるだけのことで何揉めてるの?
0668デフォルトの名無しさん2016/10/30(日) 10:28:59.39ID:TSDZ4OFC
1/10が0.1になるのがキモイです
普通0じゃないですか?
1.0/10なら0.1ですが
0669デフォルトの名無しさん2016/10/30(日) 11:32:50.61ID:Z+vVaA9C
>>667
要求仕様に対する、解析能力の確認ですね。
0670デフォルトの名無しさん2016/10/30(日) 12:21:33.43ID:dH+/za6/
>>668
https://ja.wikipedia.org/wiki/IEEE_754
0671デフォルトの名無しさん2016/10/30(日) 12:26:08.71ID:TSDZ4OFC
>>670
javaの1/10は出来ないの?
切り捨てたり切り上げたり面倒なんだけど
0672デフォルトの名無しさん2016/10/30(日) 12:39:39.62ID:dH+/za6/
>>671
出来ない
他言語の常識を持ち込むのがナンセンス
0673デフォルトの名無しさん2016/10/30(日) 12:42:33.00ID:TSDZ4OFC
>>672
mjky
■ このスレッドは過去ログ倉庫に格納されています