Estoy creando una aplicación de calculadora para ayudar con los decimales y me gustaría algo con dos decimales como a continuación:
number output ------ ------- 1 1.00 1.446 1.45 1.567 1.57Intenté usar toFixed (2) pero aparece un error porque estoy usando matemáticas y no cadenas.
También intenté usar toPrecision(4) pero también recibo un error
Cualquier ayuda sería realmente apreciada.
import React from 'react'; import {StyleSheet, Text, View, TouchableOpacity, Vibration} from 'react-native'; import {useState} from 'react'; import { Entypo } from '@expo/vector-icons'; export default function App() { const [darkMode, setDarkMode] = useState(false); const [currentNumber, setCurrentNumber] = useState(''); const [lastNumber, setLastNumber] = useState(''); const buttons = ['C', 'DEL', '/', 7, 8, 9, '*', 4, 5, 6, '-', 1, 2, 3, '+', 0, '.', '='] function calculator() { let lastArr = currentNumber[currentNumber.length-1]; if(lastArr === '/' || lastArr === '*' || lastArr === '-' || lastArr === '+' || lastArr === '.') { setCurrentNumber(currentNumber) return } else { let result = eval(currentNumber).toString(); setCurrentNumber(result) return } } function handleInput(buttonPressed) { if(buttonPressed === '+' || buttonPressed === '-' || buttonPressed === '*' || buttonPressed === '/') { Vibration.vibrate(35); setCurrentNumber(currentNumber + buttonPressed) return } else if (buttonPressed === 1 || buttonPressed === 2 || buttonPressed === 3 || buttonPressed === 4 || buttonPressed === 5 || buttonPressed === 6 || buttonPressed === 7 || buttonPressed === 8 || buttonPressed === 9 || buttonPressed === 0 || buttonPressed === '.' ) { Vibration.vibrate(35); } switch(buttonPressed) { case 'DEL': Vibration.vibrate(35); setCurrentNumber(currentNumber.substring(0, (currentNumber.length - 1))) return case 'C': Vibration.vibrate(35); setLastNumber('') setCurrentNumber('') return case '=': Vibration.vibrate(35); setLastNumber(currentNumber + '=') calculator() return } setCurrentNumber(currentNumber + buttonPressed) }De su pregunta, no está claro dónde desea realizar la conversión. Sin embargo, esto debería ponerlo en el camino correcto.
Tanto toFixed() como toPrecision() devuelven una cadena que representa un número. Está claro que no puede usar la cadena para más cálculos. Para hacerlo, use parseFloat() para obtener el número de punto flotante de la cadena.
const floatingPointNumber = 1.567; parseFloat(floatingPointNumber.toFixed(2)); parseFloat(floatingPointNumber.toPrecision(3)); Con respecto a toFixed() y toPrecision() , en realidad realizan la misma operación pero el primero da n lugares decimales mientras que el último da n dígitos (ver esta pregunta ).
Entiendo que está tratando de redondear y no solo recortar a lugares decimales. Podrías usar Math.round . Si bien se redondea al int más cercano, puede usar este truco para redondear decimales:
const roundToHundredths = num=>{ let roundedNum = Math.round(num*100)/100 // force 2 decimal places return roundedNum.toFixed(2); } Tenga en cuenta que el valor ahora es una cadena. Use parseFloat si se deben realizar otros cálculos
prueba esto, puede que te ayude;
function floatTwoDecFromString(value: string) { let newValue = value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1'); newValue = newValue.indexOf('.') !== -1 ? newValue.slice(0, newValue.indexOf('.') + 3) : newValue; return newValue; }