How to test if a double is an integer
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
// integer type
}
This checks if the rounded-down value of the double is the same as the double.
Your variable could have an int or double value and Math.floor(variable)
always has an int value, so if your variable is equal to Math.floor(variable)
then it must have an int value.
This also doesn't work if the value of the variable is infinite or negative infinite hence adding 'as long as the variable isn't inifinite' to the condition.
How can I accurately determine if a double is an integer?
double
can store an exact representation of certain values, such as small integers and (negative or positive) powers of two.
If it does indeed store an exact integer, then ((int)d == d)
works fine. And indeed, for any 32-bit integer i, (int)((double)i) == i
since a double can exactly represent it.
Note that for very large numbers (greater than about 2**52 in magnitude), a double will always appear to be an integer, as it will no longer be able to store any fractional part. This has implications if you are trying to cast to a Java long
, for instance.
Checking if float is an integer
Apart from the fine answers already given, you can also use ceilf(f) == f
or floorf(f) == f
. Both expressions return true
if f
is an integer. They also returnfalse
for NaNs (NaNs always compare unequal) and true
for ±infinity, and don't have the problem with overflowing the integer type used to hold the truncated result, because floorf()
/ceilf()
return float
s.
How to determine whether a double variable has integer value?
If I would be you, I will simply take the int/long
value of the roots and re-verify the equation to make sure that int/long
value of the root is OK or not e.g.
// using round because an equivalent int/long may be represented by a near binary fraction
// as floating point calculations aren't exact
// e.g. 3.999999.. for 4
long longRoot = Math.round(root1);
if(a*longRoot*longRoot + b*longRoot + c==0){
//its valid int root
}else{
//ignore it
}
How to determine if a decimal/double is an integer?
For floating point numbers, n % 1 == 0
is typically the way to check if there is anything past the decimal point.
public static void Main (string[] args)
{
decimal d = 3.1M;
Console.WriteLine((d % 1) == 0);
d = 3.0M;
Console.WriteLine((d % 1) == 0);
}
Output:
False
True
Update: As @Adrian Lopez mentioned below, comparison with a small value epsilon
will discard floating-point computation mis-calculations. Since the question is about double
values, below will be a more floating-point calculation proof answer:
Math.Abs(d % 1) <= (Double.Epsilon * 100)
Check double variable if it contains an integer, and not floating point
Use std::modf
:
double intpart;
modf(value, &intpart) == 0.0
Don't convert to int
! The number 1.0e+300
is an integer too you know.
Edit: As Pete Kirkham points out, passing 0 as the second argument is not guaranteed by the standard to work, requiring the use of a dummy variable and, unfortunately, making the code a lot less elegant.
What's a good way to check if a double is an integer in C#?
return Math.Truncate(number) == number;
As mentioned in the comments, you might need to take account of the fact that a double
representation of your number might not be an exact integer. In that case you'll need to allow for some margin-of-error:
double diff = Math.Abs(Math.Truncate(number) - number);
return (diff < 0.0000001) || (diff > 0.9999999);
Related Topics
How to Hide The Top Bar (With Buttons) Usin Swift and Macos
Swift Framework with Opencv Dynamic Framework, Library Not Loaded
How to Resolve Rctpromiseresolveblock After Bftask
Customize Mglpolyline Using Mapbox
Touch Sprite, Make It Jump Up Then Fall Down Again(Repeat as Many Times as Spritenode Is Tapped.)
How to Get Section of UItableview from Inside a Child UIcollectionview
Place Multiple Scn Objects in Touchesbegan Method
Uialertview or UIalertcontroller to Display Only Once in Swift
How Make Polygon Without Intersection in Swift
Swift: How to Get Image Name from Assets
Nsdocumentcontroller.Opendocument Not Allowing Selection of Custom File Type
What's a Placeholder? Why Do We Need to Define Placeholder Data Type for Generics
Swift: How to Continuously Send an Action from a Nstextfield