Modulo dan Division Untuk Bilangan yang Lebih dari Integer


Beberapa hari yang lalu aku membutuhkan untuk melakukan operasi bilangan modulo dan division untuk angka yang lebih besar dari 231 – 1 atau 2147483647 atau batas atas Integer.

Contohnya

<cfset modulo = 2147483648 % 3 />
<cfset division = 2147483648 \ 3 />

Akan menghasilkan error Cannot convert the value 2.147483648E9 to an integer because it cannot fit inside an integer.


Permasalahan ini bisa ditangani dengan menggunakan java.math.BigDecimal method remainder untuk modulo dan method divide untuk division.

Modulo

<cffunction 
	name="modBigDecimal" 
	returntype="numeric"
	displayname="modBigDecimal" 
	hint="return BigInteger of BigDecimal value" 
	>
	
	<cfargument 
		name="value" 
		type="numeric"
		required="Yes" 
		displayname="value"
		hint="the value"
		/>
		
	<cfargument 
		name="divisor" 
		type="numeric"
		required="Yes" 
		displayname="divisor"
		hint="the divisor"
		/>
	
	<!--- create java BigDecimal version of ARGUMENTS.value and ARGUMENTS.divisor --->
	<cfset LOCAL.value = CreateObject("java", "java.math.BigDecimal").init(JavaCast("string", ARGUMENTS.value)) />
	<cfset LOCAL.divisor = CreateObject("java", "java.math.BigDecimal").init(JavaCast("string", ARGUMENTS.divisor)) />
	
	<!--- do BigDecimal.remainder and convert to BigInteger --->
	<cfset LOCAL.remainder = LOCAL.value.remainder(LOCAL.divisor).toBigInteger() />
	
	<cfreturn LOCAL.remainder />

</cffunction>

Division

<cffunction 
	name="divBigDecimal" 
	returntype="numeric"
	displayname="divBigDecimal" 
	hint="return BigInteger of BigDecimal value"
	>
	
	<cfargument 
		name="value" 
		type="numeric"
		required="Yes" 
		displayname="value"
		hint="the value"
		/>
		
	<cfargument 
		name="divisor" 
		type="numeric"
		required="Yes" 
		displayname="divisor"
		hint="the divisor"
		/>
	
	<!--- create java BigDecimal version of ARGUMENTS.value and ARGUMENTS.divisor --->
	<cfset LOCAL.value = CreateObject("java", "java.math.BigDecimal").init(JavaCast("string", ARGUMENTS.value)) />
	<cfset LOCAL.divisor = CreateObject("java", "java.math.BigDecimal").init(JavaCast("string", ARGUMENTS.divisor)) / >
	
	<!--- do BigDecimal.divide with BigDecimal.ROUND_DOWN, and convert to BigInteger --->
	<cfset LOCAL.divide = LOCAL.value.divide(LOCAL.divisor, CreateObject("java", "java.math.BigDecimal").ROUND_DOWN).toBigInteger() / >
	
	<cfreturn LOCAL.divide />
	
</cffunction>

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: