您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中怎么求Logn/log2 精度,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
經過本人測試,java 中 , 一直到 2的492 次方(這么大的數,平時夠用了) ;用 Math.log(n) / Math.log(x) 公式都會產生一個整數
int x = 2 ; double n = Math.pow(2, 234) System.out.println(Math.log(n) / Math.log(x));
輸出的是 234.0
而到了 2的493次方,結果是493.00000000000006 ; 所以,平時用這個公式來確定n是否是2的整數次冪足夠了!
public class Test { public static void main(String[] args) { // System.out.println(Math.pow(2, 23)); int x = 2 ; double n = Math.pow(2, 493) ; System.out.println(Math.log(n) / Math.log(x)); } }
Double.valueOf(String) and Float.valueOf(String)都會丟失精度。
為了解決這個問題,需要用到BigDecimal類。
1. 在實例化BigDecimal 的時候用 new BigDecimal(String) 代替new BigDecimal(double) ,new BigDecimal(float)在《Effective Java》書中有提到
2. 比較兩個數的時候用compareTo 小于返回-1 , 等于返回0 , 大于返回1
import java.math.BigDecimal; public class ArithmeticUtil { /* * 小數精確的位數 */ private static final int DEF_DIV_SCALE = 10; /** * 提供精確的加法運算。 * * @param v1 * 被加數 * @param v2 * 加數 * @return 兩個參數的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精確的加法運算。 * * @param v1 * 被加數 * @param v2 * 加數 * @return 兩個參數的和 */ public static BigDecimal add(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.add(b2); } /** * 提供精確的加法運算。 String * * @param v1 * 被加數 * @param v2 * 加數 * @return 兩個參數的和 */ public static String strAdd(String v1, String v2,int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 提供精確的減法運算。 * * @param v1 * 被減數 * @param v2 * 減數 * @return 兩個參數的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精確的減法運算。 * * @param v1 * 被減數 * @param v2 * 減數 * @return 兩個參數的差 */ public static BigDecimal sub(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.subtract(b2); } /** * 對一個數字取精度 * @param v * @param scale * @return */ public static BigDecimal round(String v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(v); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP); } /** * 提供精確的減法運算。String * * @param v1 * 被減數 * @param v2 * 減數 * @return 兩個參數的差 */ public static String strSub(String v1, String v2,int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 提供精確的乘法運算。 * * @param v1 * 被乘數 * @param v2 * 乘數 * @return 兩個參數的積 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供精確的乘法運算。 * * @param v1 * 被乘數 * @param v2 * 乘數 * @return 兩個參數的積 */ public static BigDecimal mul(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2); } /** * 提供精確的乘法運算。 保留scale 位小數 * * @param v1 * 被乘數 * @param v2 * 乘數 * @return 兩個參數的積 */ public static double mul2(double v1, double v2,int scale) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return round(b1.multiply(b2).doubleValue(),scale); } /** * 提供精確的乘法運算。 保留scale 位小數 String * * @param v1 * 被乘數 * @param v2 * 乘數 * @return 兩個參數的積 */ public static String strMul2(String v1, String v2,int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以后10位,以后的數字四舍五入。 * * @param v1 * 被除數 * @param v2 * 除數 * @return 兩個參數的商 */ public static BigDecimal div(String v1, String v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以后10位,以后的數字四舍五入。 * * @param v1 * 被除數 * @param v2 * 除數 * @return 兩個參數的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以后的數字四舍五入。 * * @param v1 * 被除數 * @param v2 * 除數 * @param scale * 表示需要精確到小數點以后幾位。 * @return 兩個參數的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以后的數字四舍五入。 * * @param v1 * 被除數 * @param v2 * 除數 * @param scale * 表示需要精確到小數點以后幾位。 * @return 兩個參數的商 */ public static BigDecimal div(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP); } /** * 精確的除法運算。除不盡時,由scale參數指 定精度 四舍五入。string * * @param v1 * 被除數 * @param v2 * 除數 * @param scale * 表示需要精確到小數點以后幾位。 * @return 兩個參數的商 */ public static String strDiv(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 精確的除法運算。除不盡時,由scale參數指 定精度 四舍五入。string * * @param v1 * 被除數 * @param v2 * 除數 * @param scale * 表示需要精確到小數點以后幾位。 * @return 兩個參數的商 */ public static BigDecimal bigDiv(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP); } /** * 取余數 string * @param v1 * @param v2 * @param scale * @return */ public static BigDecimal strRemainder(String v1,String v2, int scale){ if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP); } /** * 取余數 string * @param v1 * @param v2 * @param scale * @return string */ public static String strRemainder2Str(String v1,String v2, int scale){ if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 比較大小 如果v1 大于v2 則 返回true 否則false * @param v1 * @param v2 * @return */ public static boolean strcompareTo(String v1,String v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); int bj = b1.compareTo(b2); boolean res ; if(bj>0) res = true; else res = false; return res; } /** * 比較大小 如果v1 大于等于v2 則 返回true 否則false * @param v1 * @param v2 * @return */ public static boolean strcompareTo2(String v1,String v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); int bj = b1.compareTo(b2); boolean res ; if(bj>=0) res = true; else res = false; return res; } /** * 比較大小 如果v1 等于v2 則 返回true 否則false * @param v1 * @param v2 * @return */ public static boolean strcompareTo3(String v1,String v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); int bj = b1.compareTo(b2); boolean res ; if(bj==0) res = true; else res = false; return res; } /** * 取余數 BigDecimal * @param v1 * @param v2 * @param scale * @return */ public static BigDecimal bigRemainder(BigDecimal v1,BigDecimal v2, int scale){ if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP); } /** * 提供精確的小數位四舍五入處理。 * * @param v * 需要四舍五入的數字 * @param scale * 小數點后保留幾位 * @return 四舍五入后的結果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精確的小數位四舍五入處理。string * * @param v * 需要四舍五入的數字 * @param scale * 小數點后保留幾位 * @return 四舍五入后的結果 */ public static String strRound(String v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(v); return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } }
關于Java中怎么求Logn/log2 精度就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。