Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Performing Math operations on decimal datatype in C#?

Tags:

I was wondering if the above was at all possible. For example:

Math.Sqrt(myVariableHere); 

When looking at the overload, it requires a double parameter, so I'm not sure if there is another way to replicate this with decimal datatypes.

like image 486
Qcom Avatar asked Nov 08 '10 13:11

Qcom


People also ask

Can int have decimals in C?

The integer data type in C is used to store the whole numbers without decimal values. Octal values, hexadecimal values, and decimal values can be stored in int data type in C.

What you need to put in front of a variable to allow Decimals?

The Floating Number Type float A variable declared to be of type float can be used for storing values containing decimal places.

Can long data type have decimals?

Long variables can hold numbers from -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807. Operations with Long are slightly slower than with Integer . If you need even larger values, you can use the Decimal Data Type.


2 Answers

I don't understand why all the answers to that question are the same.

There are several ways to calculate the square root from a number. One of them was proposed by Isaac Newton. I'll only write one of the simplest implementations of this method. I use it to improve the accuracy of double's square root.

// x - a number, from which we need to calculate the square root // epsilon - an accuracy of calculation of the root from our number. // The result of the calculations will differ from an actual value // of the root on less than epslion. public static decimal Sqrt(decimal x, decimal epsilon = 0.0M) {     if (x < 0) throw new OverflowException("Cannot calculate square root from a negative number");      decimal current = (decimal)Math.Sqrt((double)x), previous;     do     {         previous = current;         if (previous == 0.0M) return 0;         current = (previous + x / previous) / 2;     }     while (Math.Abs(previous - current) > epsilon);     return current; } 

About speed: in the worst case (epsilon = 0 and number is decimal.MaxValue) the loop repeats less than a three times.

If you want to know more, read this (Hacker's Delight by Henry S. Warren, Jr.)

like image 115
SLenik Avatar answered Nov 04 '22 10:11

SLenik


In most cases involving a decimal (currency etc), it isn't useful to take a root; and the root won't have anything like the expected precision that you might expect a decimal to have. You can of course force it by casting (assuming we aren't dealing with extreme ends of the decimal range):

decimal root = (decimal)Math.Sqrt((double)myVariableHere); 

which forces you to at least acknowledge the inherent rounding issues.

like image 29
Marc Gravell Avatar answered Nov 04 '22 11:11

Marc Gravell