我有一個分數串列,必須先將其轉換為 bigDecimal,然后再轉換為分數。我做了兩種方法:第一種將分數轉換為 bigDecimal,第二種方法相反。但是,我注意到在轉換程序中我失去了一些精度,因此我想知道是否有辦法以 100% 的置信度將分數恢復到其初始狀態,假設我可以存盤任意數量的小數。
這是我的代碼,在列印件上,您可以注意到我在非常小的分數上失去了精度。
package Docs;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.math3.fraction.BigFraction;
public class FractionalApproximation{
private static BigDecimal fractionToPercentage(String fraction) {
final String[] split = fraction.split("/");
final float numerator = Float.valueOf(split[0]);
final float denominator = Float.valueOf(split[1]);
return new BigDecimal((numerator / denominator) * 100).setScale(3, BigDecimal.ROUND_HALF_DOWN);
}
private static String percentageToFraction(double share){
double percentage = share / 100;
BigFraction bigFraction = new BigFraction(percentage, 0.002D, 1000);
return bigFraction.getNumerator() "/" bigFraction.getDenominator();
}
public static void main(String[] args) {
List<String> initialFractions = new ArrayList<String>(Arrays.asList("1/3","1/112","1/6","1/1","1/56","1/224", "1/448", "4/448"));
System.out.println(initialFractions);
List<BigDecimal> percentageResultList = new ArrayList<BigDecimal>();
for(String fraction : initialFractions){
percentageResultList.add(fractionToPercentage(fraction));
}
System.out.println(percentageResultList);
List<String> fractionResultList = new ArrayList<String>();
for(BigDecimal value : percentageResultList){
fractionResultList.add(percentageToFraction(value.doubleValue()));
}
System.out.println(fractionResultList);
}
}
Initial fractions :[1/3, 1/112, 1/6, 1/1, 1/56, 1/224, 1/448, 4/448]
Fractions converted to BigDecimal: [33.333, 0.893, 16.667, 100.000, 1.786, 0.446, 0.223, 0.893]
BigDecimal converted to fraction: [1/3, 1/111, 1/6, 1/1, 1/55, 1/224, 1/448, 1/111]
uj5u.com熱心網友回復:
我建議您研究連分數,特別是閱讀https://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations。該部分描述了如何使用計算連分數來以越來越高的精度表示給定的實數。
你仍然有兩個問題需要處理。
一是您需要選擇持續多長時間,即您認為這些值中的哪些實際上貢獻了應該表示的細節,哪些僅僅是計算中的噪音。如果您的大十進制沒有數字噪聲,即整數的單除法的直接和正確舍入的結果,那么您只需計算具有相同位數的每個收斂的十進制表示,并查看它們中的哪些與您的完全匹配輸入。
另一個問題是計算連分數需要許多操作,當使用大小數執行時,這些操作會導致它們自己的舍入錯誤。特別是您將需要計算多個反演,即將 x 映射到 1/x。如果在第一步中將大十進制轉換為某種形式的大有理數(即兩個大整數的商),然后在那里執行所有步驟,那么您的情況可能會更好。初始轉換和所有后續轉換都應該在大有理表示中精確。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390111.html
上一篇:如何在字串中的等式中獲取運算元,并在最后將它們重新應用于更改后的等式?
下一篇:從RANSAC回歸中提取系數
