vpa truncar round redondear decimales comando matlab vector numbers digits decimal-point

round - truncar decimales en matlab



Convertir nĂºmero decimal en vector (3)

No está familiarizado con la sintaxis de Matlab, pero si

  • convertir el número a una cadena
  • recorre cada personaje y agrega el dígito al vector si el personaje no es el punto decimal

eso funcionaria. Probablemente haya formas más eficientes de hacer esto.

En matlab quiero convertir esto:

12345.6788993442355456789

en un vector

[1 2 3 4 5 6 7 8 8 9 9 3 4 4 2 3 5 5 4 5 6 7 8 9]

He encontrado varias soluciones para convertir un entero en un vector usando comandos como scanf, num2str,... pero esos no se ajustan a los no enteros, y algunas soluciones tienen problemas con los números con una gran cantidad de decimales ...

Ese tipo de conversión es necesaria porque quiero ver y usar todos los dígitos del número.


También usando num2str , puedes hacer:

sol=arrayfun(@str2num,(sprintf(''%f'',23432.23432)),''UniformOutput'',0) horzcat(sol{:}) ans = 2 3 4 3 2 2 3 4 3

¿Desea mantener la información sobre dónde está la coma?


¿De qué fuente de entrada obtienes esos números? ¿Y son todos esos dígitos significativos? Sus números de ejemplo ya están más allá de la precisión relativa del double tipo numérico. La función eps le dirá la cantidad de redondeo que obtendrá.

>> sprintf(''%.20f'', 12345.6788993442355456789) ans = 12345.67889934423500000000 >> eps(12345.6788993442355456789) ans = 1.818989403545857e-012 >> sprintf(''%.20f'', 23432.23432345678911111111111100998) ans = 23432.23432345678900000000 >> eps(23432.23432345678911111111111100998) ans = 3.637978807091713e-012

Cuando ingresa un número en el código fuente de Matlab, se trata como un literal de tipo double . Muchos de esos dígitos se pierden tan pronto como los ingresas. Consulte esta pregunta para obtener más información: en MATLAB, ¿las variables REALMENTE son de doble precisión por defecto? .

Si realmente desea conservar todos esos dígitos, primero debe evitar almacenarlos en dobles. Comience con el número completo en una cadena, y luego analícelo.

function out = parseLongDecimal(str) ixDot = find(str == ''.''); if isempty(ixDot) out.whole = arrayfun(@str2double, str); out.fraction = []; else out.whole = arrayfun(@str2double, str(1:ixDot-1)); out.fraction = arrayfun(@str2double, str(ixDot+1:end)); end

Eso preservará todos los dígitos.

>> xAsStr = ''23432.23432345678911111111111100998''; % as a string literal, not numeric >> parseLongDecimal(xAsStr) ans = whole: [2 3 4 3 2] fraction: [2 3 4 3 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 1 1 0 0 9 9 8]

Dependiendo de su caso de uso, también podría simplemente colocarlo en un objeto Java BigDecimal y trabajar con él allí.

>> jx = java.math.BigDecimal(xAsStr) jx = 23432.23432345678911111111111100998