2011-09-17 2 views

risposta

10

Se un numero diventa un numero intero quando lo si razionalizza, utilizzare il numero intero; altrimenti rimani con il numero originale. Questo risultato è ottenuto da una funzione semplice, f[x]:

f[x_] := If[IntegerQ[n = Rationalize[x]], n, x] 

Testing ...

f[67.5] 
f[0.] 
f[45.] 

(* Out *) 
67.5 
0 
45 

non si può semplicemente Rationalize tutti i valori, come il seguente chiarisce:

rationalize

Per vedere come funziona nel tuo caso, inserisci il codice (f/@) nel tuo codice per riformattare i valori in uscita da Range:

[email protected][ 
Text[Style[ 
    ToString[(f/@ Range[0, 180, 22.5])[[#]]] <> "\[Degree]", 
    Bold, 16, GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1] 

Così

temps

+0

Grazie, combinando con bibite credo che N @ Rationalize @ qualsiasi numero dovrebbe farlo? – 500

+4

@ 500 N @ Rationalize @ non risolve il problema, perché 'N' annulla i risultati convertendo il numero intero (restituito da' Rationalize') su un numero reale! Per esempio. 'N [Razionalizza [45.]]' Restituisce "45." come risultato. – DavidC

+0

Di te David! – 500

5

In generale, è consigliabile utilizzare Rationalize.

[email protected] 
Out[1] = 10 

Tuttavia nel tuo caso, non si dovrebbe usare semplicemente Rationalize, come non si vuole operare su alcuni degli elementi. Ecco un approccio semplice che farà ciò che desideri.

list = Range[0, 180, 22.5] /. (x_ /; [email protected] == 0.) -> 
    [email protected] 
[email protected][ 
    Text[Style[ToString[list[[#]]] <> "\[Degree]", Bold, 16, 
     GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1] 

enter image description here

Il codice precedente genera la stessa lista di tuoi, e poi condizionale sostituisce quegli elementi che hanno una FractionalPart uguale a 0. (ad esempio, 10.), con la sua IntegerPart (es 10) .

+0

@ 500 Vedere la mia modifica sopra – abcd

+1

Ci possono essere problemi con questo approccio, ad es. 'AccountingForm [ 1500000 * 0.675 /. (x_ /; FractionalPart @ x == 0.) -> IntegerPart @ x] ' –

+0

@ChrisDegnen Hai ragione. Non pensavo ai casi in cui avrebbe fallito e ho testato solo il caso dell'OP. Grazie per avermelo fatto notare :) – abcd

6

Un'altra possibilità non è quella di generarli in primo luogo.

If[IntegerQ[#], #, [email protected]#] & /@ Range[0, 180, 45/2] 

dando

{0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180}

4

Un'altra opzione è quella di cancellare qualunque finali "." utilizzando StringTrim:

[email protected][ 
    Text[Style[ 
     StringTrim[ToString[Range[0, 180, 22.5][[#]]], "."] <> "\[Degree]", 
    Bold, 16, GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1] 
9

Anche se la domanda iniziale non ha numeri con esponenti, sarebbe più sicuro, in generale, da usare NumberForm come segue:

trimPoint[n_] := 
NumberForm[n, 
NumberFormat -> ([email protected] 
    RowBox[Join[{StringTrim[#1, RegularExpression["\\.$"]]}, 
    If[#3 != "", { 
     "\[Times]", SuperscriptBox[#2, #3]}, {}]] 
    ] &)] 

Poi basta modificare il codice originale inserendo // trimPoint come segue:

[email protected][ 
Text[Style[ 
    ToString[Range[0, 180, 22.5][[#]] // trimPoint] <> "\[Degree]", 
    Bold, 16, GrayLevel[(8 - #)/10]]] & /@ Range[8], 2, 1]