Friday, May 25, 2012

Dynamics AX 2012: "Precision lost" warning message

This post is copied from Peter Villadsen  blog and I thought to share it on my blog too. It really helped me a lot.


A question came up at today's webinar where a developer had a (presumably legitimate) reason to cast a real value into an integer value. The X++ language does not allow explicit casting (there's no support for it in the language), but the compiler will do its best to satisfy the user and do the conversion on its own. In this case, however, it issues a warning message, lest this is not what the user wanted.
One solution is to use the anytype type to hold the vaue for conversion and then using the any2int function, as shown below:
static void Job47(Args _args) 
{
real r = 3.13;
int i = r;      // Warning is issued here 
anytype a;

a = r;          // Assign to an anytype variable... 
i = any2int(a); // ... and back into an int 

print r;
print i;
pause;
}
This should be packaged into a function, maybe called int RealToInt(real arg).
Another way would be doing the conversion in managed code (through the System.Convert::ToInt32(object) method), but the performance will not be as good because of the marshalling that needs to take place.
I hope this helps.