2011-04-08 44 views
6

我想寫一個函數來強制Mathematica在我指定的分母中顯示一個有理數。例如,具有指定分母的理性2/3應該變爲4/6如何強制Mathematica以我指定的分母顯示理性?

我試過使用HoldForm[]Unevaluated[],但沒有成功。

In[1]:= setDenominator[x_, d_] := Unevaluated[Rational[x*d, d]]; 

In[2]:= setDenominator[2/3, 6] 

     2 
Out[2]= - 
     3 

回答

6

您可以使用FractionBoxDisplayForm

setDenominator[x_, d_] := DisplayForm[FractionBox[x*d, d]] 
+0

+1你的建議很好地工作於分數,即使分母沒有被很好地選擇:例如'setDominominator [1/3,5]'。 – DavidC 2011-04-08 21:18:02

+0

我對您的解決方案做了一個變體,允許添加和相乘分數。 – DavidC 2011-04-08 22:05:27

0

替代爲sakra例子是將存儲在字符串值:

setDenominator[x_, d_] := ToString[x d] <> "/" <> ToString[d]; 
4

HoldForm的作品,但你必須要偷偷摸摸得到x*d的數值

setDenominator[x_, d_] := [email protected][foo, d] /. foo -> x*d 

這可以通過爲d的適用性添加一些檢查來改善。

4

這裏有沙克拉的觀念的變化,允許加法和乘法......

Format[setDenominator[x_, d_]] := [email protected][x*d, d] 
setDenominator /: Plus[left___, setDenominator[x1_, d1_], right___] := left + x1 + right; 
setDenominator /: Times[left___, setDenominator[x1_, d1_], right___] :=left*x1*right; 

想出來:

a = setDenominator[3/5, 10]; 
Print[a, " + ", 2/3, " = " , a + 2/3] 
Print[a, " + ", 2/3, " = " , setDenominator[a + 2/3, 30]] 
Print[a, " × ", 2/3, " = " , a * 2/3] 
Print[a, " × ", 2/3, " = " , setDenominator[a * 2/3, 30]] 
Print[a, " ÷ ", 2/3, " = " , a /(2/3)] 

addition, multiplication, division

+0

@強李我添加了一些代碼,可以讓你添加和乘以未減少的分數。 setDenominator基於薩克拉的例程。 upvalues技巧是我從Leonid學到的東西。 [http://stackoverflow.com/questions/5200617/how-can-i-make-a-working-repeating-decimal-representation-of-a-rational-number] – DavidC 2011-04-08 22:03:39

+0

@大衛,+1,這很好! – 2011-04-08 22:59:36

+0

@強李謝謝,我很高興你喜歡它。 – DavidC 2011-04-09 00:06:54

相關問題