Decimal separator in long (Java/Spring)

I need to put the decimal separator point in a Long, I have tried in several ways, but I need it to be dynamic since the decimal separator can change, I have tried with DecimalFormat format = new DecimalFormat("###.##"); but this is not dynamic and it doesn't work the way I wanted it to

Example 1

long amount = 123456;

int decimal = 2;

The result should be Double newAmount = 1234.56

Example 2

long amount = 123456;

int decimal = 4;

The result should be Double newAmount = 12.3456

Upvotes: 0

Views: 2005

Answers (3)

Jim Garrison
Jim Garrison

Reputation: 86774

All the other answers suggest converting to double and then scaling by powers of 10 before displaying. This will result in some unexpected results because of a loss of precision in the scaling operation. For the complete, gory details on why, please read What Every Computer Scientist Should Know About Floating-Point Arithmetic and Is Floating Point Broken?

As to your problem, you should be doing the work using BigDecimal. Converting from long (or Long) to BigDecimal does not lose precision, and will always produce the expected results.

BigDecimal even has a method to do the scaling for you:

long amount = 123456;
int decimal = 2;
BigDecimal n = BigDecimal.valueOf(amount).scaleByPowerOfTen(-decimal);

Output:

1234.56

Upvotes: -1

Thanasis M
Thanasis M

Reputation: 1361

If I understand correctly, this is what you are trying to achieve:

Long amount = 123456;
int decimal = 2;
double newAmount = amount.doubleValue();
newAmount = newAmount / Math.pow(10, decimal);

Use the pow method of java.lang.math to calculate the power of a number.

Be careful to declare your variable as an object of type Long and not a primitive type if you want to use one of its functions.

As suggested, it is even simpler to just use a double variable instead of a long from the start:

double amount = 123456;
int decimal = 2;
amount = amount / Math.pow(10, decimal);

Upvotes: 1

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79345

You can get the required number by dividing the given number by 10 ^ decimalPlaces e.g.

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getNum(123456, 2));
        System.out.println(getNum(123456, 4));
    }

    static double getNum(long val, int decimalPlaces) {
        return val / Math.pow(10, decimalPlaces);
    }
}

Output:

1234.56
12.3456

Upvotes: 0

Related Questions