I have a recipe screen where the ingredients have to equal 100, my problem is that the values can have three decimal places so the tags have to be a Float.
When I type in 13.675 into a text box the Float value is 13.674653425300002303023 etc…
Normally this wouldn’t be an issue but since I have to have exactly 100 no more or less this is throwing off all of my calculations.
I tried reading the double value but that one also gives me the same output (ie… 13.6746534253 )
I tried using an expression and the round function but that didn’t work either.
I’m at a loss on what to try, I know I could build some scripting to take care of it but before i put a few hours into it i wanted to check and see if anyone else had similar issues and what they did to fix it.
Try changing the “Number Type” property to “Double” and then re-enter your value. I’m using 7.5.1 and it works for using as long as the number type is set to double.
I changed the Number Type as you suggested and I have the same result.
I am using a system.tag.write to set a memory tag to a value. Say 12.375
The memory tag is then binded to a numeric text field for display and editing.
once the tag is written to, the display is 12.375 but if you look at the properties, the float value is 12.374000980034000, the double value is 12.375, just what i want
if i read the value from the double, bam, it now reads 12.374000980034000
If i type into the text field and enter 12.375, both the double will list 12.375 while the float reads 12.374000980034000.
With this issue the only place we need to make sure the value is written correctly is to the PLC. What you are going to need to do is edit the tags Metadata settings for the Format String to this #,##0.000 this should force the value to stay in the numeric range you are wanting.
With the Metadata set and the type set to float 8 i still get the same values. I tried setting the number type to double and that also had no effect. so i figured out a python way to get around it but i think its a little clunky… This is driving me nuts!
value = 12.12500567899999
works = round(Decimal(str(value)), 3)
When a button is clicked to load the values, i check the values entered on the Numeric Text Fields (NTF). The NTF is tied to a float8 memory tag, the values the tag are loaded either from a database or manually entered.
When loaded from a DB, the values add the extra decimal places, manually entered it works.
Call when you are free and we can do a gotomeeting
This is more of a DB issue than an Ignition issue. DECIMAL data type is better for storing precise number values. Float and Real are known as approximate data types
No, its the way computers do floats. You'll need to learn how to use integers as fixed-place decimals. Use integer PLC registers where the values are thousandths of what you are using now. Scale to include a decimal point for display and for DB operations only.