groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jochen Theodorou <blackd...@gmx.org>
Subject Re: Casting Double to BigDecimal
Date Mon, 11 Jan 2016 13:00:23 GMT
We tryied to have two different kinds of casts. The normal one, that is 
more in the style of Java, which tries the cheapest way. And the "as" 
version, which calls into asType is customizable and usually does more 
expensive operations. The fallback for asType is the normal cast. That's 
why we see asType as an extended cast. But don't expect asType simply as 
something that allows for more cases than the normal cast. I can have 
different conversion logic.

Now

new BigDecimal(d)

is much cheaper than

new BigDecimal(d.toString())

That those two do not match is actually because of d.toString(), which 
does simply give 1.9 here, instead of the exact double value. That this 
toString() methods behaves in this way has not always been the case afaik.

bye Jochen

Am 11.01.2016 um 10:57 schrieb Alberto Vilches:
> Yes, I know the "1.9" literal in Groovy results in a BigDecimal. That's
> why I'm trying to force the double using the "d", but maybe is still a
> bigdecimal. So, let's try again:
>
>      Double d = 1.9
>      println((BigDecimal)d)
>
> prints "1.899999999999999911182158029987476766109466552734375"
>
> and
>
>      Double d = 1.9
>      println d as BigDecimal
>
> prints "1.9"
>
>
>
> On Fri, Jan 8, 2016 at 1:34 PM, Naresha K. <naresha.k@gmail.com
> <mailto:naresha.k@gmail.com>> wrote:
>
>     Value 1.9 will be of type BigDecimal.
>     Why are you using D?
>
>
>     On Fri, Jan 8, 2016 at 5:45 PM, Alberto Vilches <vilches@gmail.com
>     <mailto:vilches@gmail.com>> wrote:
>
>         Hi everybody! We have an issue in our application, and we
>         realized these two lines have differents results. We wonder why
>         because we think it should calls to the
>         DefaultGroovyMethods.asType(Number self, Class<T> c). But it
>         seems only the explicit call to "as" finally calls to the asType
>         and the casting do a different thing (just a new
>         BigDecimal(1.9D), but we wonder in which part of Groovy is
>         happening)
>
>         (BigDecimal)1.9D  //
>         "1.899999999999999911182158029987476766109466552734375" ->
>         1.9D as BigDecimal  // "1.9"
>
>         In fact, we tried to put these two lines in the Groovy console
>         and see the AST in all the phases. But in all of them shows the
>         same code:
>
>             public java.lang.Object run() {
>                  ((1.9) as java.math.BigDecimal)
>                  return ((1.9) as java.math.BigDecimal)
>              }
>
>         Somebody please could give some light? Thank you very much and
>         happy new year :)
>
>         --
>         Un saludo.
>         Alberto Vilches
>
>
>
>
>
> --
> Un saludo.
> Alberto Vilches

Mime
View raw message