カテゴリー : JavaScript

[JavaScript][BigDecimal] java.lang.RuntimeException: Unknown call signature for obj = new java.math.BigDecimal: object

JavaScript の bigdecimal.js ライブラリを使うときに数値じゃない値でインスタンス生成しようとすると例外が投げられるみたいです。

var bigdecimal = require("bigdecimal");
var obj = {};
 
new bigdecimal.BigDecimal(obj);
// java.lang.RuntimeException: Unknown call signature for obj = new java.math.BigDecimal: object

new bigdecimal.BigDecimal() の引数に渡す値はちゃんとチェックしてあげましょうというお話でした。


参考情報

how do i set a math context? · Issue #1 · iriscouch/bigdecimal.js

[JavaScript] java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

JavaScript で浮動小数を計算する npm モジュール bigdecimal.js で、割り算を行う divide メソッド使ったらエラー出た。

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

割り算の結果が、循環小数になる場合のエラーみたいです。

対応方法としては、循環小数になったときの処理を divide メソッドの第2、第3引数にしていしてあげればOKです。

var bigdecimal = require("bigdecimal");
 
// (1) 割り算の結果が、循環小数になるエラーの例
var one = new bigdecimal.BigDecimal(1);
var three = new bigdecimal.BigDecimal(3);
one.divide(three);
// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
 
 
// (2) エラーにならないように対応した例
// 割り算の結果を小数点第3位で四捨五入する場合は下記のような感じ
var HALF_UP = bigdecimal.RoundingMode.HALF_UP();
var result = one.divide(three, 2, HALF_UP);
 
result.floatValue();
// 0.33

ちょっと面倒ですが、厳密に値を扱えるのは良いですね。


参考情報

iriscouch/bigdecimal.js

BigDecimal.divide() 使用時の注意 – 誰も見ませんように(・`ω・´) (`・ω´・)

BigDecimalを使った割り算について – QA@IT

Java BigDecimalで足し算, 引き算, 掛け算, 割り算そして四捨五入する方法 | ホームページ制作のサカエン(墨田区)

[jQuery] .data() で整数が丸められることがあるので .attr() で取得する

jQuery の .data() メソッドで整数の桁数が多いと丸められることがあるので .attr() で取得すべきということを知りました。

jQuery 1.7.2 の場合

<!-- HTML -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<a href="/xxx" data-id="123456789012345678901234567890" id='link'>Click</a>
> //JavaScript
$('#link').data('id')
1.2345678901234568e+29
 
$('#link').attr('data-id')
"123456789012345678901234567890"

jQuery 1.11.1 の場合

<!-- HTML -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<a href="/xxx" data-id="123456789012345678901234567890" id='link'>Click</a>
> //JavaScript
$('#link').data('id')
"123456789012345678901234567890"
 
$('#link').attr('data-id')
"123456789012345678901234567890"

以上です。


参考情報

jQuery.data() | jQuery API Documentation

.attr() | jQuery API Documentation

javascript – Issue with jQuery data() treating string as number – Stack Overflow

意外と要注意 HTML5データ属性とjQuery Data APIの関係まとめ | ゆっくりと…

[JavaScript] js2coffeee で arguments が arguments_ に変換される

Js2coffeeで arguments が arguments_ に変換されて、気付かずに実行してエラーが発生しました。

arguments_js2coffee

JavaScript

arguments.callee

↓ js2coffeee

CoffeeScript

arguments_.callee

と変換したときに、アンダースコアが suffix に付いてしまったようです・・・


参考情報

arguments – JavaScript | MDN

arguments.callee – JavaScript | MDN

The Little Book on CoffeeScript – The Bad Parts

jQuery Countdown で日数だけ表示させるスニペット

jQuery Countdown で日数だけ表示させるスニペットをご紹介します。

var countDownEndDate = new Date('2015-01-01T00:00:00+0900');
 
$('#js-countdown').countdown({
  until: countDownEndDate,
  compact: true,
  compactLabels: ['', '', '', ''],
  format: 'D'
});

これで、カウントダウンする日数の部分だけ表示されます。


参考情報

jQuery Countdown

jQuery Countdown Reference