![]() |
Delphi-Version: 2010
Count digits after point
I need to know how many digits has float number after point.
Delphi-Quellcode:
Working good in most cases, but not for all :o
function CountDigitsAfterPoint(AValue: Extended): Byte;
begin Result := 0; while (Frac(AValue) <> 0) do begin Inc(Result); AValue := AValue * 10; end; end; Incorect results for sample data: 2.048 --> 19 8.448 --> 19 565.148 --> 17 32.064 --> 18 274.176 --> 17 97.728 --> 17 155.52 --> 17 622.08 --> 17 :shock: Please help :( |
AW: Count digits after point
That is because there are some inaccuracy regarding non-integer numbers.
0.99999999999999999999.... is equal to 1! (or your example: 2.048 could internally be 2.04799999999999999...) Therefore your method needs to take that into account. But sadly I have no idea since my knowledge about precision is not good. Someone else might be of help! Edit: Another problem that came to mind is irrational numbers. I thought Id mention it but it shouldnt be too problematic since the data-type cuts off after a certain degree of precision.. |
AW: Count digits after point
Hi,
maybe that'll help:
Code:
decimalplaces := (length(floattostr(number)) - pos(',',floattostr(number))-1);
|
AW: Count digits after point
@DelphiProgrammer:
Nope!
Delphi-Quellcode:
Output
var
x: Single; begin x := 2.048; writeln(x); writeln((length(floattostr(x)) - pos('.',floattostr(x))-1)); readln; end.
Code:
2.04800009727478E+0000
15 |
Re: Count digits after point
I thought about strings too, but (1) it's lame and (2) see @Aphton's post.
There is no math solution? :( |
AW: Count digits after point
This might be a problem that can be solved in another way.
You want to find out the number of fraction-digits. Why? Maybe the root problem you are trying to solve can be solved in another way! Maybe you dont even need to find out the digitcount! |
AW: Count digits after point
Why you need the number of digits? perhaps there is a better way to achieve your aim.
|
AW: Count digits after point
@mkinzler: xDD
|
Re: Count digits after point
So, reason is not important. Important is problem.
But if you want to know: (1) result is required for further computation purposes and (2) for formating. :) |
AW: Count digits after point
For (1) because the system iminent computation error the consumption more digits are better doesn't seem right to me.
For (2) I'd prefer to restrict the digits to dispay to a fixed count |
AW: Count digits after point
as the others have said, it has something to do with the approach.
but look at this. maybe it will help you! ps: doenst work for all numbers! for example x,42300000000000000001 Edit: e was randomly generated
Code:
const
e = 0.0000000001; function CountDigitsAfterPoint(AValue: Extended): Byte; var r: Extended; begin Result := 0; r := Int(AValue); while ((Frac(AValue) <> 0) and ((AValue - r) > e)) do begin Inc(Result); AValue := AValue * 10; r := Int(AValue+e); end; end; |
Re: Count digits after point
Thanks, for all values I used early, is working correctly.
BTW: why e has that value, can have other values? |
AW: Count digits after point
e is just a small number close to zero. it doesn't matter if there's one zero more or one less.
|
AW: Re: Count digits after point
Zitat:
![]() ![]() Another helpful article is ![]() |
AW: Re: Count digits after point
Zitat:
Showing the number of decimals is definitely not something to please the eye. It is showing the accuracy of your value, so a value of, say, 100 (metres) measured up to a mm is correctly shown as "100,000 m" whereas the same value with an accuracy of 1m is shown as "100m". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz