# another fp problem

Discussion in 'Python' started by Michael Hall, Oct 6, 2003.

1. ### Michael HallGuest

Hi All:

I'm a relative newbie to Python, apart from some CGI and shell scripting type
stuff. Anyway, I'm having some problems doing maths in Python 2.2.2 on RH9.

I'm wondering what is the best way or numerical data type to do simple monetary
calculations in Python? I only need to work with decimal numbers to two decimal
points. Are floating point numbers the only option? They're giving me hell!

If floating point numbers are the only option, how can I round off a number to
two decimal points? Converting to an integer is not working ... the cents disappear.

Leaving valuse as floating point is also not working ... I end up with figures
like \$35.33000000018.

BTW, I'm putting values in and out of a MySQL database (DECIMAL data type) using
MySQLdb. The values giving me the most grief have been pulled out of the
database, where they look just fine.

Mick

------------------------------------------
Ninti Systems: Linux Solutions and Support
Michael Hall
Mobile: 0429 095 392
Ph/Fax: 08 8953 1442
Email: office at ninti dot com
Web: http://ninti.com
------------------------------------------

Michael Hall, Oct 6, 2003

2. ### Joerg SonnenbergerGuest

On Mon, 06 Oct 2003 23:27:02 +1000, Michael Hall wrote:

> Hi All:
>
> I'm a relative newbie to Python, apart from some CGI and shell scripting type
> stuff. Anyway, I'm having some problems doing maths in Python 2.2.2 on RH9.
>
> I'm wondering what is the best way or numerical data type to do simple monetary
> calculations in Python? I only need to work with decimal numbers to two decimal
> points. Are floating point numbers the only option? They're giving me hell!

There is no monetary type yet, i.e. fixed point full precision for adds.

>
> If floating point numbers are the only option, how can I round off a number to
> two decimal points? Converting to an integer is not working ... the cents disappear.

You are asking the wrong question. The problem is 35.33 is a finite binary
fraction like 35.25 is. There a few thing you can do in python. Use normal
integer arithmetic with a power of ten as exponent i.e. the normal
scintific notation with an integer mantisse (3533 * 10**-2). Build a class
around it to implement the involved operations and provide a __float__
function for the conversion by MySQLdb.

>
> Leaving valuse as floating point is also not working ... I end up with figures
> like \$35.33000000018.
>
> BTW, I'm putting values in and out of a MySQL database (DECIMAL data type) using
> MySQLdb. The values giving me the most grief have been pulled out of the
> database, where they look just fine.

Perhaps you can get them as strings? Split the string in to get the number
of digits after the decimal point and set up a class like that mentioned
above.

Joerg

>
>
> Mick
>
> ------------------------------------------
> Ninti Systems: Linux Solutions and Support
> Michael Hall
> Mobile: 0429 095 392
> Ph/Fax: 08 8953 1442
> Email: office at ninti dot com
> Web: http://ninti.com
> ------------------------------------------

------------ And now a word from our sponsor ------------------
Want to have instant messaging, and chat rooms, and discussion