BigDecimal and “java.lang.ArithmeticException: Non-terminating decimal expansion”

Pada beberapa kasus operasi pembagian pada tipe data java.math.BigDecimal bisa terjadi error seperti ini:

Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

Berikut contoh kode program nya:

import java.math.BigDecimal;

/**
 * Test case for "java.lang.ArithmeticException:
 * Non-terminating decimal expansion" error with
 * BigDecimal.
 *
 * @author JM
 *
 */

public class TestBigDecimal {

    public static void main(String[] args) {

        String returnVal = TestBigDecimal.divide("1", "5");

        System.out.println("Test #1: returnVal = " + returnVal);

        returnVal = TestBigDecimal.divide("1", "2");

        System.out.println("Test #2: returnVal = " + returnVal);

        // Test(#3) will fail as the quotient (returnVal)
        // is a non-terminating decimal value.

        returnVal = TestBigDecimal.divide("1", "3");

        System.out.println("Test #3: returnVal = " + returnVal);
    }

    /**
     * Pembagian val1 dengan val2 mengembalikan nilai sebagai String.
     *
     * @param val1
     * @param val2
     * @return value as String
     */
    public static String divide(String val1, String val2) {

        BigDecimal v1 = new BigDecimal(val1);

        BigDecimal v2 = new BigDecimal(val2);

        return v1.divide(v2).toPlainString();

    }
}

Pada contoh diatas akan menghasilkan output:

Test #1: returnVal = 0.2
Test #2: returnVal = 0.5
Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(Unknown Source)
at com.jm.client.TestBigDecimal.divide(TestBigDecimal.java:34)
at com.jm.client.TestBigDecimal.main(TestBigDecimal.java:20)

Untuk mengatasi masalah ini perlu dituliskan parameter tambahan pada methode divide, seperti misalnya presisi/ketelitian bilangan dan juga RoundingMode, seperti contoh berikut ini:


import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * Test case for "java.lang.ArithmeticException:
 * Non-terminating decimal expansion" error with
 * BigDecimal.
 *
 * @author JM
 *
 */
public class TestBigDecimal {

    public static void main(String[] args) {

        String returnVal = TestBigDecimal.divide("1", "5");

        System.out.println("Test #1: returnVal = " + returnVal);

        returnVal = TestBigDecimal.divide("1", "2");

        System.out.println("Test #2: returnVal = " + returnVal);

        // Test(#3) will now work as we have provided a scale
        // and a rounding mode to the divide() method

        returnVal = TestBigDecimal.divide("1", "3");

        System.out.println("Test #3: returnVal = " + returnVal);

    }

    /**
     * Pembagian val1 dengan val2 mengembalikan nilai sebagai String.
     *
     * @param val1
     * @param val2
     * @return value as String
     */
    public static String divide(String val1, String val2) {

        BigDecimal v1 = new BigDecimal(val1);

        BigDecimal v2 = new BigDecimal(val2);

        return v1.divide(v2, 2, RoundingMode.HALF_UP).toPlainString();

    }
} 

Outputnya kira-kira seperti ini:

Test #1: returnVal = 0.20
Test #2: returnVal = 0.50
Test #3: returnVal = 0.33

Sumber:

Spring Framework 2

Melanjutkan pembahasan yang lalu, untuk class-class yang digunakan pada tutorial kali ini sama dengan tutorial sebelumnya, hanya saja disini akan ada sedikit perubahan dan penambahan file yaitu pada implementasi Class dalam hal ini kita tambah satu file lagi yaitu: CalculateSpring.java

package com.arulsoft.springtutorial;  

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class CalculateSpring {

    private Operation ops;
    private ResultWriter wtr;

    public void setOps(Operation ops) {
        this.ops = ops;
    }

    public void setWriter(ResultWriter writer) {
        this.wtr = writer;
    }

    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
        CalculateSpring calc = (CalculateSpring) factory.getBean("opsbean");
        calc.execute(args);
    }

    public void execute(String[] args) {
        long op1 = Long.parseLong(args[0]);
        long op2 = Long.parseLong(args[1]);
        wtr.showResult("The result of " + op1 + ops.getOpsName() + op2 + " is " + ops.operate(op1, op2) + "!");
    }
}

Kemudian kita buat file xml configurasi untuk spring framework:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="screen" class="com.arulsoft.springtutorial.ScreenWriter" />
    <bean id="multiply" class="com.arulsoft.springtutorial.OpMultiply" />
    <bean id="add" class="com.arulsoft.springtutorial.OpAdd" />
    <bean id="opsbean" class="com.arulsoft.springtutorial.CalculateSpring">
        <property name="ops" ref="multiply" />
        <property name="writer" ref="screen"/>
    </bean>
</beans>

Nah selesai deh, tinggal di-running, oh iya jangan lupa menambahkan library spring frameworknya. Sementara ini dulu untuk kelanjutannya tunggu postingan berikutnya…. 😀

Spring Framework Tutorial 1

Tutorial berikut adalah hasil dari belajar Spring Framework pada buku Beginning Spring Framework 2
Beginning Spring Framework 2

Konsep dari spring framework adalah bagaimana membuat aplikasi dalam bentuk komponen yang dapat disusun menjadi aplikasi yang utuh. Proses ini disebut sebagai wiring. Hal ini dapat dianalogikan seperti komponen alat listrik. Baca lebih lanjut

GWT-EXT First Try

Ini pertama kali saya mencoba men-develope program dengan GWT-EXT, tampilannya keren,  menurut saya dokumentasi dan contoh-contohnya lebih banyak dan lebih menarik ketimbang GXT,
Baca lebih lanjut