Как заставить Mathematica показать рациональное с указанным мною знаменателем? - PullRequest
6 голосов
/ 08 апреля 2011

Я хочу написать функцию, чтобы заставить Mathematica показывать рациональное число в указанном мною знаменателе. Например, рациональное 2/3 с указанным знаменателем 6 должно стать 4/6 .

Я пытался использовать HoldForm[] или Unevaluated[], но безуспешно.

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

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

        2
Out[2]= -
        3

Ответы [ 4 ]

6 голосов
/ 09 апреля 2011

Вы можете использовать FractionBox с DisplayForm :

setDenominator[x_, d_] := DisplayForm[FractionBox[x*d, d]]
4 голосов
/ 09 апреля 2011

Вот вариант идеи сакры, который допускает сложение и умножение ...

Format[setDenominator[x_, d_]] := DisplayForm@FractionBox[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

4 голосов
/ 09 апреля 2011

HoldForm работает, но вы должны быть хитрым, чтобы получить числовое значение x*d там

setDenominator[x_, d_] := HoldForm@Rational[foo, d] /. foo -> x*d

Это можно улучшить, добавив некоторые проверки на пригодность d.

0 голосов
/ 09 апреля 2011

Альтернативой для sakra примера будет сохранение значения в строке:

setDenominator[x_, d_] := ToString[x d] <> "/" <> ToString[d];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...