Ok forget what I said about the set element, it does give out the type that it took in. I still think we need to do something about calculate though.
Regards Scott 2008/10/25 Scott Gray <[EMAIL PROTECTED]>: > Thanks David, that all makes perfect sense. > > Next question :-) > Some of the minilang operations need to be revised I think, for > example <set> uses string as the default type and <calculate> defaults > to a Double. I'm wondering if we should make the type attribute > required, I've seen bugs in the past because people haven't bothered > to specify a type and my bet is that people assume in a lot of cases > that the type (for calculate at least) that they are passing in will > be the type to come out. > > The other option for calculate is that we could take Groovy's approach > and choose the best type available for the operation if one isn't > specified: > http://groovy.codehaus.org/Groovy+Math#GroovyMath-Mathoperations > > WDYT? > > Thanks > Scott > > 2008/10/24 David E Jones <[EMAIL PROTECTED]>: >> >> On Oct 23, 2008, at 3:15 AM, Scott Gray wrote: >> >>> Hi David, everyone >>> >>> I thought I'd set about changing pretty much all the doubles in the >>> accounting component to BigDecimal and I've got a couple of questions: >>> 1. Do we need to follow the standard path we've taken in the past >>> where we deprecate any methods taking or returning doubles and add Bd >>> to the end of a new BigDecimal version? I guess we do but it's going >>> to take a longer so I figure no harm in asking. >> >> I'm not sure where these got started, but they seem only really useful if >> you want a BigDecimal version of a function AND a Double version of it. >> >> I'd say no, there is no reason to continue following this pattern. It may >> break backward compatibility in esoteric areas, but really this should be >> considered a bug and all code affected should be moved to use BigDecimal >> instead of Double anyway. >> >>> 2. Slightly OT but I can't see the point of the scaled and rounded >>> ZEROs in the java files, could someone explain the advantage of them >>> over BigDecimal.ZERO? >> >> In older versions of Java there was no BigDecimal.ZERO, so this is probably >> from older code and should updated. >> >>> 3. Could someone give me an example of when to use >>> floating-point/double over fixed-point/BigDecimal? I'm not 100% sure >>> of that one. >> >> Since we're doing business applications most things should be fixed point. >> The problem with floating point is that certain decimal numbers are not >> represented accurately and so if used without rounding in a calculation >> you'll get weird results, usually something like a bunch of 9s or 1s at the >> end of a decimal part of the number. This is because a binary number >> representation for non-integer numbers basically look at 1/2 and 1/2 of 1/2 >> and 1/2 of 1/2 of 1/2, and not all fractions split up evenly like that, so >> even with a 64 bit floating point number when converted back into a base-10 >> number you get something weird. >> >> So when to use a floating point number? When you are dealing with extreme >> numbers where precision beyond a certain number of significant digits >> doesn't matter so much. For financial things ALL digits are significant, so >> a number representation that may cause you to lose some is a BAD thing. For >> scientific stuff sometimes you need numbers that are on the order to 10E30 >> or 10E-30 or the like that don't work so well for fixed point things, but >> they only really care about, say, 5 of the 30 or more possible significant >> digits. >> >> -David >> >> >>> >>> 2008/10/22 David E Jones <[EMAIL PROTECTED]>: >>>> >>>> I've created a branch, now available at: >>>> >>>> https://svn.apache.org/repos/asf/ofbiz/branches/typecheckcleanup200810 >>>> >>>> The branch split was revision 706867, so we can merge from the trunk at >>>> that >>>> rev going forward, and eventually merge back into the trunk once we're >>>> comfortable that enough things have been tested by running, perhaps using >>>> a >>>> bunch of the automated tests too (not sure how well those run in the >>>> trunk >>>> right now though, ie I haven't run them in quite some time!). >>>> >>>> Anyway, the main initial process that I targeted was ecommerce browsing, >>>> add >>>> to cart, and checkout/order. Still need to test basic things like order >>>> fulfillment, purchasing and receiving, and tons of other stuff, but >>>> hopefully most other things won't be impacted as much. >>>> >>>> Any and all help is appreciated! >>>> >>>> -David >>>> >>>> NOTE: I'm still checking out the branch and applying my patch with the >>>> work >>>> so far, so it'll be a few minutes before that's in. >>>> >>>> On Oct 21, 2008, at 10:20 PM, Scott Gray wrote: >>>> >>>>> +1 for making the changes and I'm happy to help with the mundane stuff. >>>>> >>>>> Regards >>>>> Scott >>>>> >>>>> 2008/10/22 David E Jones <[EMAIL PROTECTED]>: >>>>>> >>>>>> I added some stuff to make the warnings from entity field type checks a >>>>>> bit >>>>>> more prominent, and include a stack trace to make them easier to track >>>>>> down. >>>>>> I tried throwing exceptions instead of the warning log messages but >>>>>> that >>>>>> pretty much breaks everything, especially because we have lots of >>>>>> BigDecimal/Double problems... >>>>>> >>>>>> On the BigDecimal versus Double stuff, one of the main type change >>>>>> problems >>>>>> comes from this old issue. To help resolve this I'd like to change the >>>>>> java-type of currency-amount and currency-precise to BigDecimal instead >>>>>> of >>>>>> Double. >>>>>> >>>>>> It doesn't make sense to change the "floating-point" type's java-type >>>>>> to >>>>>> BigDecimal, because it really is a floating point like a Double. >>>>>> However, >>>>>> we >>>>>> also have many fields that need decimal precision but really should be >>>>>> fixed >>>>>> point and not floating point... but they really aren't "currency". For >>>>>> these >>>>>> I propose to add a "fixed-point" field type. This would have a >>>>>> BigDecimal >>>>>> java-type and in the database should have a type that is also fixed >>>>>> point >>>>>> (ie not DOUBLE or FLOAT), unless the database has no fixed point types >>>>>> (which is a big minus for those databases). Also, the floating-point >>>>>> type >>>>>> should have a Double java-type and a floating point SQL type. >>>>>> >>>>>> One side effect to changing the java-type on these field types is that >>>>>> it >>>>>> changes services definitions that are based on entity definitions, >>>>>> which >>>>>> causes the service engine to throw exceptions for type checks... and it >>>>>> does >>>>>> throw exceptions instead of just printing warning messages, so it does >>>>>> break >>>>>> stuff when doing that. >>>>>> >>>>>> This is a change that we can't switch back and forth on. Either all of >>>>>> these >>>>>> services take a Double typed parameters, or BigDecimal typed ones... >>>>>> and >>>>>> never some of each. >>>>>> >>>>>> Because of this I'm actually tempted to do a branch and get the changes >>>>>> going. I'm paying with a few common processes with this in place right >>>>>> now. >>>>>> >>>>>> Any thoughts related to this would be appreciated. >>>>>> >>>>>> Checking types... what a can of worms! >>>>>> >>>>>> -David >>>>>> >>>>>> >>>>>> >>>> >>>> >> >> >